本文最后更新于:2022年4月9日 中午
给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数。
示例 1:
| 输入: 1->2->3->4->5->NULL, k = 2 输出: 4->5->1->2->3->NULL 解释: 向右旋转 1 步: 5->1->2->3->4->NULL 向右旋转 2 步: 4->5->1->2->3->NULL
|
示例 2:
| 输入: 0->1->2->NULL, k = 4 输出: 2->0->1->NULL 解释: 向右旋转 1 步: 2->0->1->NULL 向右旋转 2 步: 1->2->0->NULL 向右旋转 3 步: 0->1->2->NULL 向右旋转 4 步: 2->0->1->NULL
|
Solution
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
|
class Solution { public: ListNode* rotateRight(ListNode* head, int k) { if(!head || k<=0) return head; int n = 0; ListNode* dummyHead = new ListNode(0, head); ListNode* p = dummyHead; while(p->next){ p = p->next; n += 1; } k = k % n; ListNode* slow=dummyHead, *fast=dummyHead; for(int i=0; i<k; ++i){ fast = fast->next; } while(fast->next){ slow = slow->next; fast = fast->next; } fast->next = dummyHead->next; dummyHead->next = slow->next; slow->next = nullptr; return dummyHead->next; } };
|
参考 LeetCode官方
- 先将链表闭合成环
- 找到相应的位置断开这个环,确定新的链表头和链表尾

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| class Solution { public: ListNode* rotateRight(ListNode* head, int k) { if(!head || k<=0) return head; int n = 1; ListNode* p = head; while(p->next){ p = p->next; n += 1; } p->next = head; k %= n;
for(p=head; --n != k; p=p->next);
head = p->next; p->next = nullptr; return head; } };
|