1. 程式人生 > >【python資料結構與演算法】LeetCode:反轉連結串列

【python資料結構與演算法】LeetCode:反轉連結串列

題目連結:https://leetcode-cn.com/problems/reverse-linked-list/

介紹一下反轉連結串列的思路:

首先,先明確一下輸入:輸入為一個連結串列的頭結點head

具體步驟:

  1. 先判斷頭結點或頭結點的next屬性head.next 是否為None。若是,直接返回該頭結點,說明該連結串列為空或者長度為1,沒有反轉必要;
  2. 申請兩個變數:
    1. last變數:初始為None,記錄當前操作的節點的前一個節點(也就是反轉後的連結串列的last(下一個)節點)
    2. tmp變數:初始為None,記錄當前節點的next節點(也就是翻轉後的連結串列的前面一個節點)
  3. 使用while迴圈,判斷當前節點(即head)是否為空;
  4. 若為空,先將當前的head節點的next屬性用tmp變數記錄,然後再將last記錄的上一個節點賦值給head.next。這一操作就是將當前節點的next指標指向上一個節點last,這也是反轉連結串列的核心;與此同時防止原來head.next指標指向的下一個節點丟失,所以用tmp暫時記錄一下
  5. 然後,再將當前節點head賦值給last,將剛剛tmp記錄的現節點的next節點賦值給head,即last(前一個節點)和head(當前節點)均向前走一步
  6. 最終,噹噹前節點head為空的時候,返回其上一個節點,這就是新的反轉過的連結串列的頭結點。

上程式碼:

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def reverseList(self, head):
        """
        :type head: ListNode
        :rtype: ListNode
        """
        if head is None or head.next is None:
            return head
        last,tmp = None,None
        while head:
            tmp = head.next
            head.next = last
            last = head
            head = tmp
        return last