這是劍指offer的鏈表題目,涉及到鏈表的基本知識和鏈表的反轉。
鏈表基礎知識
鏈表的基本結構
鏈表是通過一個個節點組成的,每個節點都包含了稱爲cargo的基本單元,它也是一種遞歸的數據結構。它能保持數據之間的邏輯順序,但存儲空間不必按照順序存儲。
如圖:
鏈表的基本元素有:
- 節點:每個節點有兩個部分,左邊部分稱爲值域,用來存放用戶數據;右邊部分稱爲指針域,用來存放指向下一個元素的指針。
- head:head節點永遠指向第一個節點
- tail: tail永遠指向最後一個節點
- None:鏈表中最後一個節點的指針域爲None值
以上內容爲基礎知識,具體可以參考這篇博客
反轉鏈表
因爲鏈表是有head和tail,而他們是有一個方向的,因此我們想直接進行類似list[::-1]這種反轉就不是太方便。在下面的算法中,我們通過將鏈表截斷,而後再拼接的方式進行反轉。
以{1,2,3}鏈表作爲例子,來說明下面算法中while迭代的流程(手工debug…)
1.將{2,3}的地址指向給tmp
2.將last=None指向pHead.next,這個時候pHead鏈表就被截斷了,pHead只剩下了1,因爲他的下一步指向了None
3.將此時的pHead,也就是1指向給last,這時候last爲{1}
4.將tmp={2,3}指向給pHead,此時這輪迭代結束,開啓下一輪.
這時,pHead是{2,3},last是{1}
5.將{3}指向給tmp
6.將{1}指向給pHead.next,也就是2的下一步值,因此這時候pHead就變成了{2,1}
7.將{2,1}指向給last
8.將{3}指向給pHead,此時這輪迭代結束,開啓下一輪.
這時,pHead是{3},last是{2,1}
9.將None指向了tmp
10.將{2,1}指向給pHead.next,也就是{3}的下一步值,這個時候pHead就變成了{3,2,1}
11.將{3,2,1}指向給last
12.將None指向給pHead,此時這輪迭代結束,while迭代結束。
這時pHead是{None},last是{3,2,1}
這裏最重要的是每次迭代中的第二步驟,也就是把鏈表截斷的步驟。
# -*- 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
last =None
while pHead:
tmp = pHead.next#將下一步的地址指向給tmp
pHead.next=last#將一個新的鏈表指向給舊鏈表pHead,這個時候就把pHead截斷了,只剩下前面的鏈表值
last=pHead#將舊鏈表的地址指向給新鏈表
pHead=tmp#將舊鏈表原來的下一步只指向給pHead
return last
參考
https://blog.csdn.net/qq_39422642/article/details/78988976
https://baike.baidu.com/item/鏈表/9794473?fr=aladdin