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