leetcode 61.旋转链表
题干
给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置。
示例 1:
输入:head = [1,2,3,4,5], k = 2
输出:[4,5,1,2,3]
示例 2:
输入:head = [0,1,2], k = 4
输出:[2,0,1]
提示:
链表中节点的数目在范围 [0, 500] 内
-100 <= Node.val <= 100
0 <= k <= 2 * 109
题解
由于是把所有节点向右移动k位,我们需要找到如下节点:倒数第k个结点1(作为新链表的头),倒数第k+1个结点2(作为新链表的尾),倒数第一个节点3(衔接到原链表的头)。
找到节点后按照规律连接即可。特别需要注意的是,如果k大于链表的长度,则k应该对链表长度取模后在按照上述方法操作。
class Solution {
public:
ListNode* rotateRight(ListNode* head, int k) {
if(head == nullptr) return head;
ListNode* fastPtr = head;
ListNode* kthFromRear = head;
ListNode* rear = nullptr;
int listLength = 0;
while(fastPtr != nullptr){
if(fastPtr->next == nullptr) rear = fastPtr;
fastPtr = fastPtr->next;
listLength++;
}
k %= listLength;
fastPtr = head;
for(int i = 0 ; i < k ; ++i) fastPtr = fastPtr->next;
while(fastPtr->next != nullptr){
fastPtr = fastPtr->next;
kthFromRear = kthFromRear->next;
}
rear->next = head;
head = kthFromRear->next;
kthFromRear->next = nullptr;
return head;
}
};