Description:
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=2,所以将倒数第2个节点(数值为4)开始之后的所有节点,移动到开头。并且要注意k只是一个非负数,并没有说k<=链表长度。
Solution:
了解了问题想要我们解决什么,那就好办了。
1、首先是需要对k进行处理的,将k模成小于等于链表的长度,并且可以处理成从链头开始数起是第几个,因此是需要算出链表的长度的。
2、将k转化成从链头开始数起是第几个,之后我们需要做的就是细心移动指针。
Code:
class Solution {
public:
ListNode* rotateRight(ListNode* head, int k) {
int count=0;
ListNode* temp=head;
ListNode* tail=temp;
if(k==0||!head)
return head;
while(temp)
{
count++;
tail=temp;
temp=temp->next;
}//calculate the length of link
int newk=count-k%count;//transfer k to newk
if(k%count==0)
return head;
ListNode* pre=NULL;
temp=head;
count=0;
while(count!=newk)
{
pre=temp;
temp=temp->next;
count++;
}
pre->next=NULL;
tail->next=head;
return temp;
}
};