你們好,我是靈魂畫師--茄子。技術水平通常,喜歡畫畫。指針
開始今天的正題。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技術
解法:鏈表
思路:next
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; };
思路:
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; };
結合個人分析你是否是對這道題有了更清晰的認識了呢?
以上就是個人思路以及解法了,但願你們喜歡我畫的圖解,我會繼續努力的ヾ(◍°∇°◍)ノ゙。(點個贊把我帶走吧~~)