Leetcode演算法Java全解答--61. 旋轉連結串列
阿新 • • 發佈:2018-12-26
Leetcode演算法Java全解答–61. 旋轉連結串列
文章目錄
題目
給定一個連結串列,旋轉連結串列,將連結串列每個節點向右移動 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
想法
先把連結串列程式設計一個環,然後算出要移動的位數(k%length),
把頭位置往後移k位,把頭位置的前一位的下一位變成null
比如: 12345null,–> 1234512345123…
這時候頭位置還是1,往後移動k,頭位置變成4,頭位置的前一位3的下一位變成null,
結果就是45123null
結果
超過98%的測試案例
時間複雜度/空間複雜度:n/1
總結
程式碼
我的答案
/************************************** * 題目 給定一個連結串列,旋轉連結串列,將連結串列每個節點向右移動 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 **************************************/ /************************************* 想法: 先把連結串列程式設計一個環,然後算出要移動的位數(k%length), 把頭位置往後移k位,把頭位置的前一位的下一位變成null 比如: 12345null,--> 1234512345123... 這時候頭位置還是1,往後移動k,頭位置變成4,頭位置的前一位3的下一位變成null, 結果就是45123null 我的做法 超過98%的測試案例 時間複雜度/空間複雜度:n/1 程式碼執行過程: 總結: ************************************/ public ListNode rotateRight(ListNode head, int k) { if (head == null || head.next == null) { return head; } // 連結串列長度 int count = 1; ListNode cur = head; while (cur.next != null) { ++count; cur = cur.next; } // 下一一步結束之後,已經首位相連了, cur.next = head; // 判斷要移動的個數 count = count - k % count; for (int i = 0; i < count; ++i) { cur = cur.next; } ListNode newhead = cur.next; cur.next = null; return newhead; }
大佬們的答案
/************************************** * 比我好的答案 better * ***********************************/ public ListNode better(ListNode head, int k) { if (head == null) { return null; } ListNode p = head; int n = 0; while (p != null) { n++; p = p.next; } k = k % n; p = head; for (int i = 0; i < k; i++) { p = p.next; } ListNode slow = head; while (p.next != null) { p = p.next; slow = slow.next; } p.next = head; p = slow.next; slow.next = null; return p; }
測試用例
其他
程式碼託管碼雲地址:https://gitee.com/lizhaoandroid/LeetCodeAll.git
檢視其他內容可以點選專欄或者我的部落格哈:https://blog.csdn.net/cmqwan
“大佬們的答案” 標籤來自leetcode,侵權請聯絡我進行刪改
如有疑問請聯絡,聯絡方式:QQ3060507060