首页 > 代码库 > LeetCode: Rotate List [060]

LeetCode: Rotate List [060]

【题目】


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.



【题意】

        给定一个链表L,和非负数K,要求把链表的后k个节点移到链表前


【思路】

       

        先将指针指向指向倒数第K个节点,然后反转即可
        注意
            1. k>链表长度的特殊情况
            2. k=链表长度的特殊情况, k=k%len, len为链表长度
            3. k=0;


【代码】

/**
 * 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;
        int len=0;
        ListNode*p=head;
        //获得链表长度
        while(p){len++;p=p->next;}
        //更新K值,因为K有可能比链表长度大,因此需要做取余操作
        k=k%len;
        if(k==0)return head;
        //确定倒数第k个节点
        ListNode*p1=head;
        ListNode*p2=head;
        int step=0;
        //p2先向前移动k个节点
        while(step<k && p2){step++; p2=p2->next;}
        //p1,p2同时移动,直至p2移动到链表的最后一个节点,此时p1指向的是倒数第k个节点的前一个节点。
        while(p2->next){
            p2=p2->next;
            p1=p1->next;
        }
        p2->next=head;
        head=p1->next;
        p1->next=NULL;
        return head;
    }
};