題目描述:
Given a list, rotate the list to the right by k places, where k is non-negative.
For example:
Given1->2->3->4->5->NULLand k =2,
return4->5->1->2->3->NULL.
題目解析:
題目的意思是:給定一個鏈表,將鏈表旋轉到右邊的k個位置,k是非負的。
思路:1.首先遍歷一遍鏈表,求出鏈表的長度。
2.重置一下k:當k大於鏈表長度的時候,讓k%鏈表長度,此時k是一個小於len的數。倒數第k個元素,就是正數的(len-k+1)個元素,從頭結點走到該元素,需要走len-k步。
3.將鏈表的首尾相連一下,尾節點指向頭結點。從尾節點開始走len-k步,就到了倒數第k個元素的前一個節點。新鏈表的頭結點就是倒數第k個節點,並將倒數第k個節點的前一個節點置空。
AC代碼:
/**
* 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 || k == 0)
return head;
ListNode* cur = head;
int len = 1;
while(cur->next)
{
len++;
cur = cur->next;
}
//此時cur指向最後一個節點
k = len - (k % len);
//首尾相連一下
cur->next = head;
for(int i = 0;i < k;++i)
{
cur = cur->next;
}
//新的頭結點:
head = cur->next;
//cur指向此刻的尾,置空一下
cur->next = NULL;
return head;
}
};
(*^▽^*)