61. Rotate List
解题思路
题目要求我们给一个链表旋转 k 个位置,而且把 k 的范围给了一个 ,所以考虑优化肯定需要取余。
回到解题思路本身,链表旋转本质上就是三个步骤:
- 把原来链表的 “尾巴” 接到 “ 头” 上
- 确定新的链表头
- 把新链表头的前一个链表的
next
指定为NULL
具体落实到代码里,考虑细节的话需要做到如下几步:
- 计算链表长度,并把链表尾接到链表头上
- 计算新的链表头的位置
- 留一个指针指向新链表的尾巴,并将其
next
置为NULL
C++
class Solution {
public:
ListNode* rotateRight(ListNode* head, int k) {
if (head == NULL || k == 0) return head;
int len = 1;
ListNode* cur = head;
// 计算链表长度,并把链表尾接到链表头上
while (cur->next) {
len++;
cur = cur->next;
}
cur->next = head;
cur = head;
// 计算新的链表头的位置
int step = len - (k % len);
while (--step > 0) {
cur = cur->next;
}
head = cur->next;
// 将新链表尾置为NULL
cur->next = NULL;
return head;
}
};
Javascript
var rotateRight = function (head, k) {
if (!head || k === 0) return head;
let len = 1;
let cur = head;
// 计算链表长度,并把链表尾接到链表头上
while (cur.next) {
len++;
cur = cur.next;
}
cur.next = head;
cur = head;
// 计算新的链表头的位置
let step = len - (k % len);
while (--step > 0) {
cur = cur.next;
}
head = cur.next;
// 将新链表尾置为NULL
cur.next = null;
return head;
};