[leetcode 25]. K 個一組翻轉連結串列

Makerr發表於2024-10-04

題目描述:

https://leetcode.cn/problems/reverse-nodes-in-k-group

給你連結串列的頭節點 head ,每 k 個節點一組進行翻轉,請你返回修改後的連結串列。

k 是一個正整數,它的值小於或等於連結串列的長度。如果節點總數不是 k 的整數倍,那麼請將最後剩餘的節點保持原有順序。

你不能只是單純的改變節點內部的值,而是需要實際進行節點交換。

示例 1:

輸入:head = [1,2,3,4,5], k = 2
輸出:[2,1,4,3,5]

示例 2:

輸入:head = [1,2,3,4,5], k = 3
輸出:[3,2,1,4,5]

提示:

  • 連結串列中的節點數目為 n
  • 1 <= k <= n <= 5000
  • 0 <= Node.val <= 1000

進階:你可以設計一個只用 O(1) 額外記憶體空間的演算法解決此問題嗎?

解題思路:

影片講解:

【影片第三段】https://www.bilibili.com/video/BV1sd4y1x7KN

和92題反轉過程類似,⚠️要建立臨時變數nxt儲存p0.next,最後更新p0=nxt,開啟下一輪迴圈

程式碼(C++&Python):

[leetcode 25]. K 個一組翻轉連結串列
class Solution:
    def reverseKGroup(self, head: Optional[ListNode], k: int) -> Optional[ListNode]:

        # 統計連結串列個數
        n=0
        cur=head
        while cur:
            n+=1
            cur=cur.next
        
        dummy=ListNode(next=head)
        p0=dummy

        # 每次反轉前看剩餘節點個數是否>=k,>=k則反轉,否則不反轉
        while n>=k:
            n-=k
            cur=p0.next
            pre=None
            for _ in range(k):
                nxt=cur.next
                cur.next=pre
                pre=cur
                cur=nxt
            
            # 儲存下一輪迴圈的上一個節點為p0
            next=p0.next
            p0.next.next=cur
            p0.next=pre
            p0=next
        
        return dummy.next
View Code

[leetcode 25]. K 個一組翻轉連結串列
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* reverseKGroup(ListNode* head, int k) {
        int n=0;
        ListNode* cur=head;
        while(cur){
            n++;
            cur=cur->next;
        }

        ListNode dummy(0,head);
        ListNode* p0=&dummy;
        ListNode* nxt=nullptr;
        ListNode* pre=nullptr;
        cur=p0->next;

        while(n>=k){
            n-=k;
            for(int i=0;i<k;i++){
                nxt=cur->next;
                cur->next=pre;
                pre=cur;
                cur=nxt;
            }

            ListNode* next=p0->next;
            p0->next->next=cur;
            p0->next=pre;
            p0=next;
        }

        return dummy.next;    
    }
};
View Code

思路總結:

做題順序:

206. 反轉連結串列

24. 兩兩交換連結串列中的節點

92. 反轉連結串列 II
25. K 個一組翻轉連結串列
由易到難,逐步擴充思路
影片講解:
【反轉連結串列】https://www.bilibili.com/video/BV1sd4y1x7KN

相關文章