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;
}