LeetCode 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
解法:
1.快慢指针解法
思路:
- 设立一个慢指针,设立一个快指针
- 快指针先走k步,然后快慢指针一起移动到链表的结尾
- 快指针指向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.成环法
思路:
- 计算链表长度,求出要移动的距离k
- 首尾成环,创建一个指针p,p移动k个长度
- 在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;
};
结合我的分析你是不是对这道题有了更清晰的认识了呢?
以上就是我的思路以及解法了,希望大家喜欢我画的图解,我会继续努力的ヾ(◍°∇°◍)ノ゙。(点个赞把我带走吧~~)
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。