輸入一個鏈表,輸出反轉后的鏈表。
非遞歸實現:
# -*- 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 is None:
return pHead
last = None #指向上一個節點
while pHead:
# 先用tmp保存pHead的下一個節點的信息,
# 保證單鏈表不會因為失去pHead節點的next而就此斷裂
tmp = pHead.next
# 保存完next,就可以讓pHead的next指向last了
pHead.next = last
# 讓last,pHead依次向后移動一個節點,繼續下一次的指針反轉
last = pHead
pHead = tmp
return last
上面程序中的while循環是主要部分,主體部分代碼簡單,但不是很好理解,下面用圖示方法,以三個鏈表節點為例來展示其反轉過程。
- 初始鏈表狀態
需要定義一個變量last指向pHead的上一個節點

- 一次迭代之后
x0先暫時被從鏈表中脫離出來,由last指向,作為反轉的新鏈,x0反轉之后會是最后一個節點,因此next指向None,pHead則指向原鏈的下一個節點x1。
- 兩次迭代之后
x1被脫離出來加入反轉的新鏈,並插入x0之前,pHead再后移。
- 三次迭代之后
反轉完成,pHead指向None即結束循環,返回last即為新鏈表的頭結點。
遞歸實現:
# -*- 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 not pHead or not pHead.next:
return pHead
else:
newHead = self.ReverseList(pHead.next)
pHead.next.next=pHead
pHead.next=None
return newHead
