1. 程式人生 > >乘風破浪:LeetCode真題_025_Reverse Nodes in k-Group

乘風破浪:LeetCode真題_025_Reverse Nodes in k-Group

乘風破浪: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    }

     通過上面的圖,我們可以更加清楚地明白程式的內容。

 

三、總結

    在處理這樣的問題的時候,我們一定要畫圖,通過圖中指標的變化,我們可以很容易、很準確的寫出程式碼。另外也要注意頭插法

對於連結串列排序的作用,當然尾插法也是我們最常用的方式。