- Rotate List
中文English
Given a list, rotate the list to the right by k places, where k is non-negative.
Example
Example 1:
Input:1->2->3->4->5 k = 2
Output:4->5->1->2->3
Example 2:
Input:3->2->1 k = 1
Output:1->3->2
解法1:双指针,先得到len-k个节点的位置,然后链表重新拼接。
注意:
1)k可能很大,故用k %= len
2)当k == len时,直接返回head即可,后面的代码不适合k==len的情况。
代码如下:
/**
* Definition of singly-linked-list:
* class ListNode {
* public:
* int val;
* ListNode *next;
* ListNode(int val) {
* this->val = val;
* this->next = NULL;
* }
* }
*/
class Solution {
public:
/**
* @param head: the List
* @param k: rotate to the right k places
* @return: the list after rotation
*/
ListNode * rotateRight(ListNode * head, int k) {
if (!head || k == 0) return head;
int len = 1;
ListNode * p = head, * tail = NULL;
while(p->next) {
len++;
p = p->next;
}
k %= len;
if (k == 0) return head;
tail = p;
k = len - k;
p = head;
for (int i = 0; i < k - 1; ++i) {
p = p->next;
}
ListNode * newHead = p->next;
p->next = NULL;
tail->next = head;
return newHead;
}
};