不管全世界所有人怎么说,我都认为自己的感受才是正确的。无论别人怎么看,我绝不打乱自己的节奏。喜欢的事自然可以坚持,不喜欢的怎么也长久不了。
LeetCode:原题地址
题目要求
给你一个链表的头节点 head
,旋转链表,将链表每个节点向右移动 k
个位置。
示例 1:
输入:head = [1,2,3,4,5], k = 2
输出:[2,1,4,3,5]
示例 2:
输入:head = [1,2,3,4,5], k = 3
输出:[3,2,1,4,5]
复制代码
提示:
- 链表中节点的数目在范围
[0, 500]
内 -100 <= Node.val <= 100
0 <= k <= 2 * 109
思路
特判:空链表/只有一个节点的链表/移动步数为0 => 直接返回头结点 拿到链表总长度(待会会用到去计算实际移动的步数)& 连接成环形链表(尾节点指向头节点) 取模计算实际移动的步数move 根据move移动指针寻找截断点 保存截断点之后的点t(也就是新链表的头结点) 截断环形链表成普通链表 返回新链表的头结点
代码
var rotateRight = function(head, k) {
if (!head || !head.next || !k) return head; //特判
let len = 1, curr = head;
while (curr.next) {
curr = curr.next;
len ++;//拿到链表总长度
}
curr.next = head; //连接成环形链表
let move = len - (k % len);//取模计算实际移动的步数
while (move) {
curr = curr.next;//根据move移动指针寻找截断点
move --;
}
let t = curr.next; //保存截断点之后的点t(也就是新链表的头结点)
curr.next = null; //截断成普通链表
return t;//返回新链表的头结点
};