乘風破浪:LeetCode真題_025_Reverse Nodes in k-Group
阿新 • • 發佈:2019-01-04
乘風破浪:LeetCode真題_025_Reverse Nodes in k-Group
一、前言
將一個連結串列按照一定的長度切成幾部分,然後每部分進行翻轉以後再拼接成一個連結串列是比較困難的,但是這也能鍛鍊我們的思維能力。
二、Reverse Nodes in k-Group
2.1 問題
2.2 分析與解決
最簡單的想法,我們可以將連結串列分成幾部分,每一個部分分開考慮,比如使用頭插法,正好可以將順序顛倒一下,或者我們通過某種方式使得順序發生改變,然後再結合起來。
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */ class Solution { public ListNode reverseKGroup(ListNode head, int k) { ListNode dom = new ListNode(0); dom.next = head; ListNode tmp = head; int size = 0; //獲取佇列長度 //get list size while (tmp != null) { tmp = tmp.next; size++; } //如果長度不夠,則直接返回 if (size < k) return head; //切割陣列,並轉換 //split list, and reverse sub list int position = 0; ListNode pre = dom; ListNode rHead = null; ListNode rTail = null; ListNode next = null; for (int count = 0; (count + 1) * k <= size; count++) { position = 0; rHead = null; rTail = null; tmp = pre.next; //翻轉子佇列 //reverse sub list while (position < k) { next = tmp.next; if (rTail == null) { rHead = tmp; rTail = tmp; } else { tmp.next = rHead; rHead = tmp;} tmp = next; position++; } if (rHead != null) { pre.next = rHead;//這一步第一次就將頭指標賦值給了dom.next,這樣完成了銜接和搭配 rTail.next = tmp; pre = rTail; } } return dom.next; } }
在我們的程式中,如下面的程式碼其實就是頭插法的實現。
1 if (rTail == null) { 2 rHead = tmp; 3 rTail = tmp; 4 } else { 5 tmp.next = rHead; 6 rHead = tmp; 7 }
通過上面的圖,我們可以更加清楚地明白程式的內容。
三、總結
在處理這樣的問題的時候,我們一定要畫圖,通過圖中指標的變化,我們可以很容易、很準確的寫出程式碼。另外也要注意頭插法 對於連結串列排序的作用,當然尾插法也是我們最常用的方式。