Python編程題44--反轉鏈表

題目

給定一個單鏈表的頭節點 head ,請實現反轉鏈表,並返回反轉後的鏈表。

例如:

原鏈表轉換爲列表:[1, 2, 3, 4, 5]
最終的鏈表轉換爲列表:[5, 4, 3, 2, 1]

原鏈表轉換爲列表:[1, 2]
最終的鏈表轉換爲列表:[2, 1]

原鏈表轉換爲列表:[]
最終的鏈表轉換爲列表:[]

已知 鏈表節點的定義、鏈表與列表相互轉換 的代碼如下:

class ListNode:  # 單鏈表
    def __init__(self, val=0, next=None):
        self.val = val  # 鏈表節點上存儲的元素
        self.next = next  # 指向下一個鏈表節點


def list_to_list_node(numbers):  # 將列表轉換爲單向鏈表,並返回鏈表的頭節點
    dummy_head = ListNode(0)
    pre = dummy_head
    for number in numbers:
        pre.next = ListNode(number)
        pre = pre.next
    pre = dummy_head.next
    return pre


def list_node_to_list(node):  # 將單向鏈表轉換爲列表
    result = []
    while node:
        result.append(node.val)
        node = node.next
    return result

實現思路

  • 設置兩個指針:cur、pre,分別指向當前節點和前一個節點,cur默認指向鏈表頭節點head,pre默認爲None
  • 當 cur 非空時進行循環,我們要實現鏈表的反轉,只需要在每次循環過程中讓 cur 指向 pre ,這樣操作下來就能讓當前節點指向其前一個節點
  • 循環結束後得到的就是反轉後的鏈表,注意此時 pre 指向原鏈表中的最後一個節點,我們只需要把 pre 返回即可

代碼實現--迭代

class Solution:
    def reverseList(self, head: ListNode) -> ListNode:
        cur = head  # 當前節點
        pre = None  # 前一個節點
        while cur is not None:
            tmp_node = cur.next  # 臨時保存當前節點的下一個節點 cur.next , 下一步要改變 cur.next
            cur.next = pre  # 反轉, 當前節點通過 next 指向前一個節點
            pre = cur  # 將前一個節點變爲當前節點
            cur = tmp_node  # 將當前節點變爲保存的臨時節點
        return pre

上面代碼中使用了一箇中間變量 tmp_node ,其實我們可以直接利用Python的多元賦值來完成,從而使代碼更加簡潔。優化如下:

class Solution:
    def reverseList(self, head: ListNode) -> ListNode:
        cur, pre = head, None  # 當前節點,前一個節點
        while cur is not None:
            # 當前節點通過 next 指向前一個節點,將前一個節點變爲當前節點,將當前節點變爲下一個節點
            cur.next, pre, cur = pre, cur, cur.next
        return pre

代碼實現--遞歸

class Solution:
    def reverseList(self, head: ListNode) -> ListNode:
        return self.reverse_recursive(None, head)

    def reverse_recursive(self, pre: ListNode, cur: ListNode) -> ListNode:
        if cur is None:
            return pre
        tmp_node = cur.next  # 臨時保存當前節點的下一個節點 cur.next , 下一步要改變 cur.next
        cur.next = pre  # 反轉,當前節點通過 next 指向前一個節點
        return self.reverse_recursive(cur, tmp_node)

更多Python編程題,等你來挑戰:Python編程題彙總(持續更新中……)

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