1. 程式人生 > >LeetCode 61. 旋轉連結串列 Rotate List(C語言)

LeetCode 61. 旋轉連結串列 Rotate List(C語言)

題目描述:

給定一個連結串列,旋轉連結串列,將連結串列每個節點向右移動 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

題目解答:

方法1:雙指標

第一遍遍歷求出連結串列長度n,通過觀察發現,新的頭節點為第n - k個節點(從0開始計數),所以一個指標儲存新的頭結點,另一個指標標記原來的頭結點,然後將兩個連線起來。
執行時間4ms,程式碼如下。

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode* rotateRight(struct ListNode* head, int k)
{ if(head == NULL || head->next == NULL) return head; int i = 0; struct ListNode *temp = head, *tail = NULL; while(temp->next) { i++; temp = temp->next; } tail = temp; i++; k = i - k % i - 1; if(k == i - 1) return head; tail->
next = head; while(k) { k--; head = head->next; } temp = head; head = head->next; temp->next = NULL; return head; }