Given a list, rotate the list to the right by k places, where k is non-negative.
Example:
Given 1->2->3->4->5->NULL and k = 2,
return 4->5->1->2->3->NULL.
思路:首先遍历链表算出链表长度len,然后计算出k%len,即所需要的最小rotate次数,然后把链表分成两段交换即可。
/**
* 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) return NULL;
//计算链表的长度
ListNode* tmp = head;
int len = 0;
while (tmp) {
len++;
tmp = tmp->next;
}
//旋转k%len次得到的结果和旋转k次得到的结果是相同的
k = k % len;
if (k == 0) return head;
//post->next指向的是倒数第k个元素
ListNode* pre = head;
ListNode* post = head;
for (int i = 0; i < k; i++) {
pre = pre->next;
}
while (pre->next) {
pre = pre->next;
post = post->next;
}
//post->next前后的链表互换位置,即得到最终结果
ListNode* newHead = post->next;
pre->next = head;
post->next = NULL;
return newHead;
}
};