1. 程式人生 > >LeetCode | Rotate List(迴圈右移連結串列)

LeetCode | 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>n的時候k = k%n。然後再進行,也就是要先遍歷一邊連結串列求出其長度。

有了連結串列以後,也不能直接找到n-k-1的結點,因為連結串列最後的指標還要指向頭結點。但網友有個辦法,遍歷連結串列時只遍歷到最後一個結點然後計算總長度。

先上自己的程式碼:

class Solution {
public:
    ListNode *rotateRight(ListNode *head, int k) {
        if(head == NULL || k <= 0)
            return head;

        int n = 0;
        ListNode *p = head;
        while(p){
            p = p->next;
            ++n;
        }
        if(k%n == 0)
            return head;
        k = k%n;    //迴圈找
        p = head;
        int i = 1;
        //找到第k個節點
        while(p->next && i < k){
            p = p->next;
            i++;
        }
        //這時候p一定不為NULL,因為k<n
        ListNode *q = head;
        p = p->next;
        while(p->next != NULL){
            p = p->next;
            q = q->next;    //p遍歷完以後,指向倒數第K+1個結點
        }
        p->next = head;
        head = q->next;
        q->next = NULL;
        return head;
    }
};


再看網友的程式碼:

class Solution {
public:
    ListNode *rotateRight(ListNode *head, int k)
    {
        if(head==NULL)return NULL;
        ListNode *p=head;
        int n=0;
        while(p->next)
        {
            p=p->next;
            n++;
        }
        n++;
        k=k%n;
        p->next=head;   //這裡就處理了尾指標
        ListNode *q=head;
        for(int i=0;i<n-k-1;i++)
        q=q->next;
        head=q->next;
        q->next=NULL;
        return head;
    }
};