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->NULL, k = 4
輸出:2->0->1->NULL
解釋:
向右旋轉 1 步:2->0->1->NULL
向右旋轉 2 步:1->2->0->NULL
向右旋轉 3 步:0->1->2->NULL
向右旋轉 4 步:2->0->1->NULL
仔細觀察題目你可以發現,當所給的K值大於鏈表的長度時旋轉結果就是之前已經發生過的旋轉結果,爲了減少時間的消耗,我們應該減少標兵指針移動的步數.
解題思路和步驟
- 遍歷單鏈表,作用有兩個
- 1.計算鏈表長度
- 2.找到鏈表的最後一個結點
-
將鏈表首尾連接
-
根據鏈表長度和所給數字計算頭指針移動步數
-
返回旋轉結果
代碼實現
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* rotateRight(ListNode* head, int k) {
if(head==nullptr || head->next==nullptr){
return head;
}
int len=1;
ListNode* cur=head;
while(cur->next){
len++;
cur=cur->next;
}
cur->next=head;//將首尾連接
int mod=len-k%len;
while(mod--){
cur=head;
head=head->next;
}
cur->next=nullptr;//破壞環結構,恢復非環狀結構
return head;
}
};