61. 旋轉連結串列
阿新 • • 發佈:2018-12-09
給定一個連結串列,旋轉連結串列,將連結串列每個節點向右移動 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
解答如下:
/** * 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; } };