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
.
创建一个哨兵节点phead,pthread->next=head,第一次遍历求出链表的长度len以及链表的最后节点tail,k=k%len,通过第二次遍历找到前半段的最后一个节点curr。如果curr==tail,那么说明k%len为0,只需返回head;否则phead->next = tail,tail->next=curr->next;curr->next = NULL(不加的还结果为循环列表,导致leetcode判定会超时);返回pthread->next.
代码如下:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* rotateRight(ListNode* head, int k) {
if(head == NULL || head->next == NULL || k == 0)
return head;
ListNode* phead = new ListNode(0);
ListNode* curr= head,*tail = head;
int len =0;
while(tail->next != NULL)
{
tail = tail->next;
len++;
}
len++;
k = k%len;
if(k == 0 )
return head;
int count = 0;
while( count < len-k-1)
{
curr = curr->next;
count++;
}
phead->next = curr->next;
curr->next = NULL;
tail->next = head;
return phead->next;
}
};