掘金团队号上线,助你 Offer 临门! 点击 查看详情
题目描述
给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置。
示例:
输入:head = [1,2,3,4,5], k = 2
输出:[4,5,1,2,3]
解题思路
如图所示:
- 先把这个链表看成一个顺时针旋转的圈,向右移动k个位置就是顺时针转两个值
- 记录链表长度,当走到尾部节点时,将链表首尾相连,形成一个环状链表
- 找到新链表的尾部节点,与新链表的头部节点断开链接。新链表尾部节点 = 链表长度 - k%链表长度(比如k为12,链表长度为5,那实际上k还是等于向右走了两步)
解题代码
var rotateRight = function (head, k) {
if(!head) return null;
let [listLen, cur, tail] = [1, head, head];
while (cur && cur.next) {
listLen += 1;
cur = cur.next;
}
cur.next = head;
for (let i = 1; i < listLen - k % listLen; i++) {
tail = tail.next;
}
cur = tail.next;
tail.next = null;
return cur;
};
总结
不清楚的时候,以比较小的单位画个图,就会清晰很多