LeetCode #24. Swap Nodes in Pairs プログラミング練習

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

LinkedListの問題が立て込んでますね。
やはりArrayとは違い、LinkedLIstはノード毎に繋がりをもっているので、
ただ隣接のノードの値を交換するのではなく、ノードの持つ繋がりを変えなければいけません。
そもそもswapとかにはあまり向いてない型なのですがデータ構造を理解するにはいい問題です。

注意すべき事: 

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

以下回答です。

class Solution {
    public ListNode swapPairs(ListNode head) {
        if (head == null || head.next == null) return head;
        ListNode h = new ListNode(0);
        h.next = head;
        ListNode p = h;
        while (p.next != null && p.next.next != null) {
            ListNode temp = p;
            p = p.next;
            temp.next = p.next;
            
            ListNode temp2 = p.next.next;
            p.next.next = p;
            p.next = temp2;
        }
        return h.next;
    }
}

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

pは最初のノードnullを指しています。
p.nextは入力の最初のノード1を指しています。
while文に入ります。
ListNode temp = p;
p = p.next;
temp.next = p.next;
この文でnull->2->3->4になります。
    1↗
pは1を指しています。
続いて
ListNode temp2 = p.next.next;
p.next.next = p;
p.next = temp2;
この文でnull->2->1->3->4になります。
ここで最初の二つのノードのスワップが完了しました。
注意すべきは、この時点でpは1を指しているので、p=p.nextの処理は不要です。
whileを最後まで実行すればすべてのノードがスワップされます。

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