反轉鏈表[劍指offer]之python實現


輸入一個鏈表,輸出反轉后的鏈表。

非遞歸實現:

# -*- 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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM