LeetCode 25. K 個一組翻轉鏈表 | Python

25. K 個一組翻轉鏈表


題目來源:https://leetcode-cn.com/problems/reverse-nodes-in-k-group

題目


給你一個鏈表,每 k 個節點一組進行翻轉,請你返回翻轉後的鏈表。

k 是一個正整數,它的值小於或等於鏈表的長度。

如果節點總數不是 k 的整數倍,那麼請將最後剩餘的節點保持原有順序。

示例:

給你這個鏈表:1->2->3->4->5

當 k = 2 時,應當返回: 2->1->4->3->5

當 k = 3 時,應當返回: 3->2->1->4->5

說明:

  • 你的算法只能使用常數的額外空間。
  • 你不能只是單純的改變節點內部的值,而是需要實際進行節點交換。

解題思路


思路:迭代、翻轉鏈表

具體思路:

  • 首先要確保翻轉的範圍,這個是由題目中提及的 k 來控制;
  • 關於鏈表的翻轉,要注意前驅和後繼的問題,防止指向錯誤,這裏也爲了將翻轉後的鏈表與後續進行連接;
  • 定義 pre 和 tail,pre 表示待翻轉鏈表部分的前驅,tail 表示末尾;
  • 上面的 tail 經由 k 控制到達末尾;
  • 翻轉鏈表,將翻轉後的部分與後續進行拼接;
  • 注意:根據題意,當翻轉部分的長度小於 k 時,這個時候不做處理。

具體的代碼實現如下。

代碼實現


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

class Solution:
    def reverseKGroup(self, head: ListNode, k: int) -> ListNode:
        if head == None and head.next == None and k < 2:
            return head
        # 定義哨兵節點
        dummy = ListNode(0)
        # 指向節點
        dummy.next = head

        # 定義前驅後繼節點
        pre = dummy
        tail = dummy

        # 控制 tail 到待翻轉鏈表部分的末尾
        while True:
            count = k
            while count > 0 and tail != None:
                count -= 1
                tail = tail.next
            # 到達尾部時,長度不足 k 時,跳出循環
            if tail == None:
                break

            # 這裏用於下次循環
            head = pre.next
            # 開始進行翻轉
            while pre.next != tail:
                tmp = pre.next
                pre.next = tmp.next
                tmp.next = tail.next
                tail.next = tmp
            
            # 重置指針
            pre = head
            tail = head
        
        return dummy.next

實現結果


實現結果


以上就是使用迭代,根據題目提供的 k 值確定翻轉鏈表部分,在內部實現翻轉,進而解決《25. K 個一組翻轉鏈表》的主要內容。其中注意要定義鏈表的前驅和後繼,防止指向錯誤。

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