輸入一個鏈表,反轉鏈表後,輸出新鏈表的表頭-python解法

輸入一個鏈表,反轉鏈表後,輸出新鏈表的表頭-python解法


這是劍指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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章