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大于链表长度的时候,必须从头开始遍历。
/**
* 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 || k < 0)
return NULL;
if(k == 0)
return head;
ListNode * rear = head;
ListNode * fore = head;
ListNode * temp;
int i = 0;
while(i<k)
{
fore = fore->next;
if(!fore) //k的长度大于链表长度
fore = head;
i++;
}
while(fore->next)
{
fore = fore->next;
rear = rear->next;
}
//此时rear指向待旋转节点的前一个节点
//fore指向最后一个节点
fore->next = head;
head = rear->next;
rear->next = NULL;
return head;
}
};
因为while循环里面忘了写i++,硬是不知道哪儿出错了,最后在VS里面才调试出来,囧死!
测试代码:
int main()
{
int num[2]={1,2};
struct ListNode *head = new ListNode(0);
struct ListNode *temp = head;
for(int i=0; i<2; i++)
{
struct ListNode * p = new ListNode(num[i]);
temp ->next = p;
temp = p;
}
temp = head;
head = head->next;
delete temp;
cout<<"原始链表:";
temp = head;
while(temp)
{
cout<<temp->val<<" ";
temp = temp->next;
}
cout<<endl;
Solution sol;
head = sol.rotateRight(head, 1);
cout<<"操作后链表:";
while(head)
{
cout<<head->val<<" ";
temp = head;
head = head->next;
delete temp;
}
cout<<endl;
return 0;
}