题目如图:
对于链表的问题可以自己在纸上绘制一些图形,这可以加深理解,有利于后续实现
(循环实现)
将每一步之后的各个链表的状态表示如下:
假设初始链表:
循环之前各链表的状态:
第一次循环之后的状态:
第二次循环之后的状态:
第三次循环之后的状态:
第四次循环之后的状态:
此时cur为空链表,退出while循环。返回newHead链表,即原链表的反转链表。
-
# -*- coding:utf-8 -*-
-
# class ListNode:
-
# def __init__(self, x):
-
# self.val = x
-
# self.next = None
-
class Solution:
-
# 返回ListNode
-
def ReverseList(self, pHead):
-
# write code here
-
if pHead ==
None
or pHead.next ==
None:
-
return pHead
-
cur = pHead
-
tmp =
None
-
newhead =
None
-
while cur:
-
tmp = cur.next
-
cur.next = newhead
-
newhead = cur
-
cur = tmp
-
return newhead
-
-
# 可以修改原链表的话,更简单
-
class Solution:
-
def reverseList(self, head):
-
"""
-
:type head: ListNode
-
:rtype: ListNode
-
"""
-
if
not head
or
not head.next:
-
return head
-
Node =
None
-
while head:
-
p = head
-
head = head.next
-
p.next = Node
-
Node = p
-
return Node
(递归实现)
初始链表:
求链表 A->B->C->D 的反转链表, 可以先求 B->C->D 的反转链表 D->C->B,然后将 A 连在B后面就完成了。
这就将原问题转变为求更小的子问题:求 B->C->D 的反转链表 ...... 依次往下转变就行。
我们从最内层开始看链表的各个状态,假设Head链表为传入函数的参数,NewHead 为内层函数向上返回的链表。
最内层状态:
次内层状态:
倒数第三层链表状态:(这一层第一个图中NewHead指向的是d节点)
最外层状态:
函数最外层返回链表NewHead,即原链表pHead的反转。
-
class Solution:
-
# 返回ListNode
-
def ReverseList(self, pHead):
-
# write code here
-
if
not pHead
or
not pHead.next:
-
return pHead
-
NewHead = self.ReverseList(pHead.next)
-
pHead.next.next = pHead
-
pHead.next =
None
-
return NewHead