Leetcode OJ: Rotate List

Rotate List

Given a list, rotate the list to the right by k places, where k is non-negative.

For example:
Given 1->2->3->4->5->NULL and k = 2,
return 4->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 };
原文地址:https://www.cnblogs.com/flowerkzj/p/3616555.html