leetcode 24-兩兩交換鏈表中的節點

題目

給定一個鏈表,兩兩交換其中相鄰的節點,並返回交換後的鏈表。
示例:
給定 1->2->3->4, 你應該返回 2->1->4->3.
說明:
你的算法只能使用常數的額外空間。
你不能只是單純的改變節點內部的值,而是需要實際的進行節點交換

解析

在這裏插入圖片描述
解讀:如上圖所示,需要交換1,2兩個節點。那麼分三步走:

  • 第一步:修改pre節點的next指向節點2
  • 第二步:修改節點1的next指向節點3
  • 第三步:修改節點2的next指向節點1
    然後只需要保存上一次交換後的末尾節點,一直循環,考慮好邊界條件。

代碼實現

public static ListNode swapPairs(ListNode node) {


        if(node == null || node.next == null){
            return node;
        }
        /**
         * 因爲頭節點是start而不是pre,所以需要新建一個虛擬節點root
         */
        ListNode root = new ListNode(0);
        root.next = node;
        ListNode pre = root;
        while (pre.next != null && pre.next.next != null){
            /**
             * 定義start和then
             */
            ListNode start = pre.next;
            ListNode then = pre.next.next;
            /**
             * 三步走
             */
            pre.next = then;
            start.next = then.next;
            then.next = start;
            /**
             * 下一個pre節點爲start節點
             */
            pre = start;
        }

        /**
         * 這裏應該也是返回虛擬節點的next
         */
        return root.next;
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章