旋轉連結串列20201224
阿新 • • 發佈:2020-12-25
技術標籤:每天一道演算法題指標連結串列演算法leetcode
旋轉連結串列
0.題目
給定一個連結串列,旋轉連結串列,將連結串列每個節點向右移動 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.解題
1.1分析
主要思路:向右旋轉的意思就是倒數第K個節點作為新的頭結點,尾節點與原頭結點連線,作為一個完整的連結串列返回。
- 因為K可能大於連結串列長度,所以儘量控制移動的長度在連結串列長度範圍內,所以需要對連結串列長度取餘;
- 那麼自然需要計算連結串列的長度num;計算k的值,範圍為[0, num];
- 通過雙指標找到倒數第k個節點;快指標到達尾部,慢指標則到達倒數第K個節點;
- 尾節點指向原頭結點;返回慢指標指向的節點;
1.2程式碼
// 主要思路是找到倒數第k個節點,然後把該節點作為頭結點返回;
public ListNode rotateRight(ListNode head, int k) {
if (head == null || k <= 0) return head;
// 統計節點個數,對K取模;減少K值重複迴圈
ListNode cur = head;
int num = 1;
while (cur. next != null) {
cur = cur.next;
num++;
}
k = k % num;
// 通過雙指標,找到倒數第k個節點
ListNode pre = new ListNode(0);
pre.next = head;
ListNode low = pre;
ListNode fast = pre;
while (fast != null && k > 0) {
fast = fast.next;
k--;
}
// 快慢指標同時出發,快指標到尾部
while (fast.next != null) {
low = low.next;
fast = fast.next;
}
// 慢指標指向的則是新的頭指標
fast.next = pre.next;
pre.next = low.next;
// 斷鏈
low.next = null;
return pre.next;
}