騰訊精選50題☞旋轉鏈表

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;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章