leetcode 25 k個一組翻轉鍊錶

2021-10-23 09:43:12 字數 1546 閱讀 6588

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

k 是乙個正整數,它的值小於或等於鍊錶的長度。

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

示例:給你這個鍊錶:1->2->3->4->5

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

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

說明:你的演算法只能使用常數的額外空間。

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

通過次數82,171提交次數132,846

思路:

這道題解法很多,但總體的思路是模擬,將鍊錶分為長度為k的鍊錶段,分別翻轉每個段內的各個元素,之後將新的頭尾正確的鏈結起來即可。難點在於,本題需要考慮的邊界條件比較多,思路容易混亂,容易導致最後的鍊錶鏈結出錯。難點和易混淆點主要有以下幾個:

1. 設計翻轉k為長度的鍊錶,傳入需要翻轉的鍊錶的起始節點,返回翻轉之後的起始節點。這裡和翻轉單鏈表沒有太大差別;

2. 與1相對應的,傳入的起始節點需要正確的傳入,計數為k,如果尾指標初始在頭結點的位置,那麼向後移動k個位置之後,尾指標的位置向後多移動了一位,因此,每次在移動尾指標之前,需要將尾指標初始化到pre節點。

3. 每次翻轉鍊錶之後返回的頭尾指標是新的頭尾指標,他們的next指向已經不能使用,並且需要給他們指定正確的指向。這就需要儲存乙個pre指標,和乙個next指標,分別指向前驅結點和後繼節點;

4. 可以使用dummy節點,好處有兩方面,乙個是可以記錄頭結點的位置以便返回,另乙個是可以設定為起始位置的pre節點,減少邊界條件的判斷。

/**

* definition for singly-linked list.

* struct listnode

* };

*/class

solution

if(tail==

nullptr

) listnode* next = tail-

>next;

tie(head,tail)

=helper

(head,tail)

; pre-

>next = head;

tail-

>next = next;

//cout<<"head:"next:"val<<"\t"<<"tail:"pre = tail;

head = tail-

>next;

}return dummy-

>next;

} pair,listnode*

>

helper

(listnode* head,listnode* tail)

p->next = pre;

return;}

};

LeetCode 25 k個一組翻轉鍊錶

給出乙個鍊錶,每 k 個節點一組進行翻轉,並返回翻轉後的鍊錶。k 是乙個正整數,它的值小於或等於鍊錶的長度。如果節點總數不是 k 的整數倍,那麼將最後剩餘節點保持原有順序。給定這個鍊錶 1 2 3 4 5 當 k 2 時,應當返回 2 1 4 3 5 當 k 3 時,應當返回 3 2 1 4 5 這...

LeetCode 25 K個一組翻轉鍊錶

按照每k個為一組,記錄這組內的頭和尾,第一組只需記錄翻轉後的尾即tail 接下來的每一組記錄翻轉後頭 nhead 和尾 ntail.注意更新的順序 class solution length k if length 0 return head p head listnode otail head l...

leetcode 25 k個一組翻轉鍊錶

題目描述 給出乙個鍊錶,每 k 個節點一組進行翻轉,並返回翻轉後的鍊錶。k 是乙個正整數,它的值小於或等於鍊錶的長度。如果節點總數不是 k 的整數倍,那麼將最後剩餘節點保持原有順序。示例 給定這個鍊錶 1 2 3 4 5 當 k 2 時,應當返回 2 1 4 3 5 當 k 3 時,應當返回 3 2...