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等于0及k大于链表长度的情况,可以通过取余就可以解决,对于这个题目,我们可以设置两个指针,一前一后,前面的指针走到第k个节点,后面指针走到第一个节点,知道前面的指针走到链表末尾,那么后面指针就是第K个节点,然后进行旋转。
class Solution {
public:
ListNode* rotateRight(ListNode* head, int k) {
ListNode *pHead, *pAhead,*pBehind,*temp,*p,*p1;
int n = 1;
int count = 0;
if(head == NULL) //考虑空节点
{
return NULL;
}
pHead = head;
pAhead = head;
temp = head;
while(temp) //获取链表长度
{
count++;
temp = temp->next;
}
k = k % count;
if(k==0||head->next == NULL) //考虑k =0
{
return head;
}
while(n < k) //前一个指针,指向第k个节点
{
pAhead = pAhead->next;
n++;
}
pBehind = head;
while(pAhead->next)
{
p = pAhead;
pAhead = pAhead->next;
p1 = pBehind;
pBehind = pBehind->next;
}
if(k == 1) //考虑仅末尾节点进行旋转
{
p->next= NULL;
pAhead->next = head;
return pAhead;
}
pAhead->next = head; //非末尾节点旋转。
pHead =p1->next;
p1->next = NULL;
return pHead;
}
};