你们好,我是灵魂画师--茄子。技术水平通常,喜欢画画。指针
开始今天的正题。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; };
结合个人分析你是否是对这道题有了更清晰的认识了呢?
以上就是个人思路以及解法了,但愿你们喜欢我画的图解,我会继续努力的ヾ(◍°∇°◍)ノ゙。(点个赞把我带走吧~~)