1. 程式人生 > 其它 >旋轉連結串列20201224

旋轉連結串列20201224

技術標籤:每天一道演算法題指標連結串列演算法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; }