码迷,mamicode.com
首页 > 其他好文 > 详细

206.反转链表

时间:2019-08-25 00:47:08      阅读:55      评论:0      收藏:0      [点我收藏+]

标签:span   移动   如何   返回   空间复杂度   for   核心   结果   复杂   

<语法及技巧><完全没思路> <抽象能力><知识短板> <...>   (标签)

题目

反转一个单链表。

示例:

输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL

进阶:
你可以迭代或递归地反转链表。你能否用两种方法解决这道题?

 

我的思路 1 - (不推荐)

1.构造了一个新链表,开辟了新的数组,空间复杂度增加了。。。

2.链表遍历一次,数组遍历一次。。用了O(2n)的时间复杂度。。。

‘‘‘
我的思路:
1.遍历链表,把结果存到数组
2.构造新链表,链表的值是反转的数组的值
‘‘‘
class Solution(object):
    def reverseList(self, head):

        newNode = newHead = ListNode(0)
        node=head
        nodeList=[]
        if not head:
            return head
        while node:
            nodeList.append(node.val)
            node=node.next
        for x in range(len(nodeList)-1):
            newNode.val=nodeList.pop()
            newNode.next = ListNode(0)
            newNode = newNode.next
        newNode.val = nodeList.pop()
        return newHead
        

 

我的思路 2 - (实现细节有问题)

(错)

class Solution(object):
    def reverseList(self, head):
        if not head:return head
        #让node从第二个节点开始
        node = head.next
        

        #前节点指向head(错误)
        #想要实现node->1,即node指向前节点的1
        #事实上指向了head这条链表。。。
        pNode = head  #(错误!!!!正确应该是pNode = None,当然前一句代码也要修改)
        
        ‘‘‘
        核心代码
        1.node保持当前节点的移动
        2.pNode代表node的前一个节点
        3.bNode代表node的后一个节点


        遍历到倒数第二个节点的时候退出,此时node处于节点末尾,
        再手动把末尾节点和之前的节点连接起来
        关注点分散成了当前节点和下一个节点,使代码变复杂了。。
        如果只关注当前节点,node会指向None。
        那么返回它前一个节点不就好了么????? ---> pNode
        ‘‘‘
        while node and node.next:
            bNode = node.next
            node.next = pNode
            print(node.val)
            pNode = node
            node = bNode
        node.next = pNode
        return node

 

我的思路 3 - 递归

(错)

1.如何在递归中让 pre = None ??

class Solution(object):
    def reverseList(self, head):
        #和思路1的问题一样
        #在第二层递归中会出现node.next = head的情况导致超时
        #另外这种这种写法会导致pre一直是当前节点,达不到保存前一个节点的目的!!!
        pre = head
        nxt = head.next
        head.next = pre
        if not nxt:return pre
        return self.reverseList(nxt)

 

 

题解 1 - 迭代

class Solution(object):
    def reverseList(self, head):
        if not head:return head
        node = head
        pNode = None
        
        while node:
            bNode = node.next
            node.next = pNode
            pNode = node
            node = bNode
        return pNode
            
            

 

总结

206.反转链表

标签:span   移动   如何   返回   空间复杂度   for   核心   结果   复杂   

原文地址:https://www.cnblogs.com/remly/p/11406425.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!