206.反转链表

Posted remly

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了206.反转链表相关的知识,希望对你有一定的参考价值。

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

题目

反转一个单链表。

示例:

输入: 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.反转链表的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode206. 反转链表

图解 LeetCode206:反转吧,链表!

图解 LeetCode206:反转吧,链表!

[LeetCode] 206. 反转链表

剑指offerJZ15——反转链表。leetcode206.反转链表

[JavaScript 刷题] 链表 - 反转链表, leetcode 206