題解:解題思路
題意:將鍊錶每個節點向右移動 kk 個位置,相當於把鍊錶的後面 k % len 個節點移到鍊錶的最前面。(len 為 鍊錶長度)
所以本題的步驟:
求鍊錶長度;
找出倒數第 k+1k+1 個節點;
鍊錶重整:將鍊錶的倒數第 k+1k+1 個節點和倒數第 kk 個節點斷開,並把後半部分拼接到鍊錶的頭部。
1. 求鍊錶長度
求鍊錶長度應該是鍊錶最基本的題型了,直接用乙個指標 curcur ,開始時指向鍊錶的頭 headhead,一直向後移動到 curcur 為空時,經歷的鍊錶節點數就是鍊錶長度。
2. 找出倒數第 k+1 個節點
可以先在 劍指 offer 22. 鍊錶中倒數第k個節點 進行練習。
思路是:
兩個指標 slow 和 fast 值距離是 kk,先讓 fast 指向鍊錶的第 k + 1k+1 個節點,slow 指向第 1 個節點;
然後 slow 和 fast 同時向後移動,當 fast 移動到鍊錶的最後乙個節點的時候,那麼 slow 指向鍊錶的倒數第 k + 1k+1 個節點。
3. 鍊錶重整
重整操作的步驟是:
newhead 是新鍊錶的頭部,它應該是原鍊錶倒數第 kk 個節點,即 slow.next;
slow 需要跟 slow.next 斷開;
fast 是老鍊錶的結尾,將 fast.next 設定為老鍊錶的開頭,實現首尾相接。
可以用下面的圖來幫助理解:鍊錶是1->2->3->4->5->null, k=2。圖中 ① 是讓 fast 指向第 k+1k+1 個節點;圖中 ② 是 fast 和 slow 同時後移至鍊錶結尾,此時 slow指向鍊錶倒數第 k+1k+1 個節點;圖中 ③ 是鍊錶重整的操作。
// 快指標應該走的步數
int step = k % length;
//快指標先走step
listnode* fast = head;
for (int i = 0; i < step; ++i)
if (!fast) return head;
// 塊,慢指標繼續向後走
listnode* slow = head;
while(fast->next)
// 將鍊錶連線
fast->next = head;
// 記錄新節點
listnode *new_head = slow->next;
// 更新未接電
slow->next = nullptr;
return new_head;}};
61 旋轉鍊錶
給定乙個鍊錶,旋轉鍊錶,將鍊錶每個節點向右移動 k 個位置,其中 k 是非負數。示例 1 輸入 1 2 3 4 5 null,k 2 輸出 4 5 1 2 3 null 解釋 向右旋轉 1 步 5 1 2 3 4 null 向右旋轉 2 步 4 5 1 2 3 null 示例 2 輸入 0 1 2 ...
61,旋轉鍊錶
給定乙個鍊錶,旋轉鍊錶,將鍊錶每個節點向右移動 k 個位置,其中 k 是非負數。示例 1 輸入 1 2 3 4 5 null,k 2輸出 4 5 1 2 3 null解釋 向右旋轉 1 步 5 1 2 3 4 null 向右旋轉 2 步 4 5 1 2 3 null示例 2 輸入 0 1 2 nul...
61 旋轉鍊錶
給定乙個鍊錶,旋轉鍊錶,將鍊錶每個節點向右移動 k 個位置,其中 k 是非負數。示例 1 輸入 1 2 3 4 5 null,k 2 輸出 4 5 1 2 3 null 解釋 向右旋轉 1 步 5 1 2 3 4 null 向右旋轉 2 步 4 5 1 2 3 null 示例 2 輸入 0 1 2 ...