61. Rotate List
方法1: two pointers
思路:
- 快指针先走k步
- 快慢指针同时移动
- 快指针指向最后一个节点时,慢指针将指向rotate之后的尾端
- 重建链头
易错点
- 快指针最后指向最后节点, 而不是null
- 因为会有k >> n的情况, 为了避免超时,先统计n,再求 k %= n
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* rotateRight(ListNode* head, int k) {
if (!head) return nullptr;
ListNode* current = head;
int n = 0;
while (current) {
current = current -> next;
n ++;
}
k %= n;
ListNode* slow = head, *fast = head;
for (int i = 0; i < k; i++){
fast = fast -> next;
}
while (fast -> next){
fast = fast -> next;
slow = slow -> next;
}
fast -> next = head;
fast = slow -> next;
slow -> next = nullptr;
return fast;
}
};
方法2: 循环
思路:
统计长度n, 将头尾相连,求出k%=n。向前移动n-k步,拆开链表
易错点:
前进次数, m = n - k % n,最后会停在新链的最后一个节点
class Solution {
public:
ListNode *rotateRight(ListNode *head, int k) {
if (!head) return NULL;
int n = 1;
ListNode *cur = head;
while (cur->next) {
++n;
cur = cur->next;
}
cur->next = head;
int m = n - k % n;
for (int i = 0; i < m; ++i) {
cur = cur->next;
}
ListNode *newhead = cur->next;
cur->next = NULL;
return newhead;
}
};