leetcode 61题
给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数。
示例 1:
输入: 1->2->3->4->5->NULL, k = 2 输出: 4->5->1->2->3->NULL 解释: 向右旋转 1 步: 5->1->2->3->4->NULL 向右旋转 2 步: 4->5->1->2->3->NULL
示例 2:
输入: 0->1->2->NULL, k = 4 输出:2->0->1->NULL
解释: 向右旋转 1 步: 2->0->1->NULL 向右旋转 2 步: 1->2->0->NULL 向右旋转 3 步: 0->1->2->NULL 向右旋转 4 步: 2->0->1->NULL
向右移动k个位置,有三种情况:
1.k比链表长度小,也就是把最后k个数移动到链表前面
2.k与链表长度相等,很明显,链表移动后是与原来一致的。
3.因此可以得出第三点,如果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 || !head->next){
return head;
}
ListNode* p = head;
int n = 1;
while(p->next != NULL){
p = p->next;
n++;
}
p = head;
k = k % n;
if(!k){
return head;
}
int len = n - k;
for(int i = 1;i < len;i++){
p = p->next;
}
ListNode* q = p->next;
p->next = NULL;
p = q;
while(q->next != NULL){
q = q->next;
}
q->next = head;
return p;
}
};