1. 程式人生 > >61. 旋轉連結串列

61. 旋轉連結串列

給定一個連結串列,旋轉連結串列,將連結串列每個節點向右移動 個位置,其中 是非負數。

示例 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

解答如下:

/**
 * 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) {
        ListNode* ptr=head;
        ListNode* end=head;
        if(end==NULL)
            return NULL;
        int size=1;
        
        //統計節點個數,同時獲取鏈尾地址
        while(end->next!=NULL){
            size++;
            end=end->next;
        }
        //獲取需向左移動的次數
        int dis=k%size;
        //移動size*n次,等於不移動
        if(dis==0)
            return head;
        //連環
        end->next=ptr;
        int i=1;
        //向左移動dis次,等於向右移動size-dis次
        while(i<size-dis){
            ptr=ptr->next;
            i++;
        }
        //確定頭指標位置
        head=ptr->next;
        //斷鏈
        ptr->next=NULL;
        return head;
    }
};