LeetCode #25. Reverse Nodes in k-Group プログラミング練習

問題:
f:id:stlisacity:20180528172521p:plain
難易度: hard
入力: ListNode
目的: 隣接のn個のノードをすべてスワップして返せ
出力: ListNode

前回の♯23問の延長問題です。
23問目は隣接二つのノードをスワップする問題でしたが、
今回の問題は隣接n個のノードをスワップしなければなりません。
しかし基本的な考え方は同じですので、ノード間の位置関係を変えていけばいいのです。

注意すべき事: 

  • Extra SpaceはO(1)に抑える
  • 各ノードが持つ値をスワップするのではなく関係を変換しましょう。
  • nがノード数を上回る時はそのまま返す

以下回答です。

class Solution {
    public ListNode reverseKGroup(ListNode head, int k) {
        if (head == null || head.next == null || k<2) return head;
        ListNode h = new ListNode(0);
        h.next = head;
        ListNode t = h; //tail
        ListNode p = h; //prev
        int count;
        while (true) {
            count = k;
            while (t != null && count > 0) {
                t = t.next;
                count--;
            }
            if (t == null) break;
            head = p.next;
            while (p.next != t) {
                ListNode temp = p.next;
                p.next = temp.next;
                temp.next=t.next;
                t.next=temp;
            }
            p = head;
            t = head;
        }
        
        return h.next;
    }
}

whileで前から一つずつスワップして行くアルゴリズムです。
例で説明しますと:
入力:
1->2->3->4 k = 2

pは最初のノードnullを指しています。
p.nextは入力の最初のノード1を指しています。
tailはpからn番目のノードを指しています。
while文に入ります。
ListNode temp = p.next;
p.next = temp.next;
temp.next=t.next;
t.next=temp;
この文でnull->2->1->3->4になります。
while文に入る前にhead = p.nextの処理をしているので
whileのあとにp,tをheadに指せば次のノードに移ってくれます。
whileを最後まで実行すればすべてのノードがスワップされます。

今日は以上。
よいプログラミング生活を!