反转一个单链表。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
进阶:
你可以迭代或递归地反转链表。你能否用两种方法解决这道题?
解题思路
很经典的问题,首先设置pre,cur,lat
三个指针
pre cur lat
null 1 -> 2 -> 3 -> 4 -> 5 -> null
接着cur.next = pre
pre cur lat
null <-1 2 -> 3 -> 4 -> 5 -> null
接着pre = cur
,cur = lat
,lat = lat.next
pre cur lat
null <-1 2 -> 3 -> 4 -> 5 -> null
重复上述操作直到lat=None
。
pre cur lat
null <-1 <- 2 <- 3 <- 4 5 -> null
最后cur.next = pre
即可。
class Solution:
def reverseList(self, head):
"""
:type head: ListNode
:rtype: ListNode
"""
pre = None
cur = head
lat = head.next
while lat != None:
cur.next = pre
pre = cur
cur = lat
lat = lat.next
cur.next = pre
return cur
我们再回过头来看上述代码,这个代码其实有一个重大的bug
。如果head=None
,那么lat = cur.next
就会出问题。
其实我们可以这样写
class Solution:
def reverseList(self, head):
"""
:type head: ListNode
:rtype: ListNode
"""
pre = None
cur = head
while cur != None:
lat = cur.next
cur.next = pre
pre = cur
cur = lat
return pre
这个问题使用递归就更简单了,我们知道reverseList(head)
返回输入的链表反转后的head
,那么如果reverseList(head.next)
的话
head
1->2<-3<-4<-5
|
node
我们此时只需要head.next.next=head
,也就是先建立一个双向连接
head
1->2<-3<-4<-5
<- |
node
然后再head.next=None
,返回node
即可。
head
null<-1<-2<-3<-4<-5
|
node
代码如下
class Solution:
def reverseList(self, head):
"""
:type head: ListNode
:rtype: ListNode
"""
if head == None or head.next == None:
return head
node = self.reverseList(head.next)
head.next.next = head
head.next = None
return node
我将该问题的其他语言版本添加到了我的GitHub Leetcode
如有问题,希望大家指出!!!