思路1:连接成环
- 一开始的思路是双指针,但
如果很大,速度上不去,所以必须要读出初始链表的长度
,这一步不得不做 - 将
tail
和head
连接起来,变成环 - 找到合适的位置断开,
#card=math&code=step%20%3D%20list%5C_size%20-%20%28k%20%5C%25%20list%5C_size%29&id=vCyRz)
代码1:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* rotateRight(ListNode* head, int k) {
// 虽然我不愿意去读整个链表的长度,但是出于简化计算的目的,还是需要这么干的
if (!head || k <= 0) {
return head;
}
int list_size = 1;
ListNode* ptr_1 = head;
while (ptr_1->next) {
ptr_1 = ptr_1->next;
list_size++;
}
ptr_1->next = head;
int step = list_size - (k % list_size);
while (step--) {
ptr_1 = ptr_1->next;
}
ListNode* new_head = ptr_1->next;
ptr_1->next = nullptr;
return new_head;
}
};