LeetCode 61. 旋轉連結串列 Rotate List(C語言)
阿新 • • 發佈:2018-12-27
題目描述:
給定一個連結串列,旋轉連結串列,將連結串列每個節點向右移動 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;
}