茄子算法每日N題之LeetCode61.旋轉鏈表

LeetCode 61.旋轉鏈表

你們好,我是靈魂畫師--茄子。技術水平通常,喜歡畫畫。指針

開始今天的正題。code

leetCode61.旋轉鏈表leetcode

給定一個鏈表,旋轉鏈表,將鏈表每一個節點向右移動 k 個位置,其中 k 是非負數。get

示例 1:io

輸入: 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->NULLfunction

示例 2:class

輸入: 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技術

解法:鏈表

1.快慢指針解法

思路:next

  1. 設立一個慢指針,設立一個快指針
  2. 快指針先走k步,而後快慢指針一塊兒移動到鏈表的結尾
  3. 快指針指向head,慢指針處斷開
let rotateRight = function(head, k) {
        if (!head) return null;
        let pre = head;
        let cur = head;
        let i = 0;
        while(i < k){ // 快指針走k步,若是到達null則從頭開始再走
          cur = cur.next ? cur.next : head;
          i++
        }
        while(cur.next != null){ // 一塊兒前進
          cur = cur.next;
          pre = pre.next;
        }
        
        cur.next = head;  // 5 -> 1 -> 2 // 這個時候已經成環了 
        let res = pre.next; // 4 -> 5 -> 1 ->..... -> 3 ->(從這裏斷開) 4
        pre.next = null;
        return res;

};

2.成環法

思路:

  1. 計算鏈表長度,求出要移動的距離k
  2. 首尾成環,建立一個指針p,p移動k個長度
  3. 在p指針處斷開環。
let rotateRight = function(head, k) {
    if (!head) return null;
    let p = head;
    let length = 1;
    while (p.next != null) { // 算出鏈表長度
        p = p.next;
        length++;
    } 
    k = length - (k % length); // 處理要移動的距離
    p.next = head; // 首尾相接
    while (k) {
        p = p.next;
        k--;
    };
    let res = p.next;  // 斷開環
    p.next = null;  
    return res;
};

結合個人分析你是否是對這道題有了更清晰的認識了呢?

以上就是個人思路以及解法了,但願你們喜歡我畫的圖解,我會繼續努力的ヾ(◍°∇°◍)ノ゙。(點個贊把我帶走吧~~)

相關文章
相關標籤/搜索