61 旋轉鍊錶

2021-09-28 17:09:54 字數 2344 閱讀 9413

題解:解題思路

題意:將鍊錶每個節點向右移動 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 ...