Rotate List
Given a list, rotate the list to the right by k places, where k is non-negative.
For example:
Given1->2->3->4->5->NULL
and k =2
,
return4->5->1->2->3->NULL
.
就是给一个循环列表,有个头的链接,求转动k个位置后链接头的变化
这里的话其实是要找出倒数第k个数的位置,然后在这个位置截开,后面链表接上前面链表的头。
找出倒数第k个数首先思路用的是快慢指针。
但是有一个需要考虑的就是k可以很大,因为这个是循环链表(虽然在数据结构上是不循环的。)。
所以当k比列表长度大时需要进行求余,把实际的要移动的位置确定下来。代码如下:
1 /** 2 * Definition for singly-linked list. 3 * struct ListNode { 4 * int val; 5 * ListNode *next; 6 * ListNode(int x) : val(x), next(NULL) {} 7 * }; 8 */ 9 class Solution { 10 public: 11 ListNode *rotateRight(ListNode *head, int k) { 12 if (head == NULL || head->next == NULL || k == 0) 13 return head; 14 int kstep = 0, istep = 0; 15 ListNode* p = head; 16 // 快指针先行 17 while (p != NULL && kstep < k) { 18 p = p->next; 19 kstep++; 20 } 21 22 // 快指针到达了最结尾 23 if (p == NULL) { 24 // 求余看实际位置 25 k = k % kstep; 26 // 为0表示不需要转动 27 if (k == 0) 28 return head; 29 30 // 快指针再走一次 31 p = head; 32 kstep = 0; 33 while (p != NULL && kstep < k) { 34 p = p->next; 35 kstep++; 36 } 37 } 38 39 // 快慢指针一起前行 40 ListNode* subHead = head; 41 ListNode* preEnd = NULL; 42 ListNode* preSub = NULL; 43 while (p != NULL) { 44 preEnd = p; 45 p = p->next; 46 preSub = subHead; 47 subHead = subHead->next; 48 } 49 // 截断然后拼接 50 preSub->next = NULL; 51 preEnd->next = head; 52 return subHead; 53 } 54 };