思路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; }};