思考
题目要求:给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置。
根据示例1: k = 2 的情况
当往链表往右移动以为的时候,实际上是链表尾节点,变成首节点,这样可以看出这个链表是循环的只是展示的位置不一样
解题思路
- 首先先将链表做出环形链表
- 根据移动的位置数,确定尾节点的位置。
因为链表只能向后查找,所以我们可以根据节点个数和需要 k 个数获得尾节点位置 - 将尾节点指向null。
代码
var rotateRight = function(head, k) {
if (!head) return head;
let pre = tail = head, cnt = 1;
while (pre.next) {
pre = pre.next;
cnt++;
}
// 做成环形链表
pre.next = head;
// 确定往后查找的位置
cnt = cnt - k % cnt;
while (--cnt) {
tail = tail.next;
}
pre = tail.next;
// 将尾节点指向空,形成非环形链表
tail.next = null;
return pre;
};