1. 程式人生 > >乘風破浪:LeetCode真題_024_Swap Nodes in Pairs

乘風破浪:LeetCode真題_024_Swap Nodes in Pairs

應該 tno http sin highlight 怎麽 算法 bsp def

乘風破浪:LeetCode真題_024_Swap Nodes in Pairs

一、前言

這次還是鏈表的操作,不過我們需要交換鏈表奇數和偶數位置上的節點,因此要怎麽做呢?

二、Swap Nodes in Pairs

2.1 問題

技術分享圖片

要求是不能修改節點的元素,並且使用的空間也是常數級別的,不能使用更高的內存空間。

2.2 分析與解決

通過分析我們可以使用簡單的遍歷算法,通過四個指針來解決,當然我們也可以使用遞歸算法來解答。

   使用正常遍歷算法:

public class Solution {
    /**
     * 題目大意
     * 給定一個單鏈表,成對交換兩個相鄰的結點。算法法應該做常量輔助空間,不能改結點的值,只能交換結點。
     *
     * 解題思路
     * 使用一個頭結點root來輔助操作,對要進行交換的鏈表,每兩個的位置進行交換,
     * 並且把交換後的結點接到root的鏈表上,直到所有的結點都處理完。
     */
    public ListNode swapPairs(ListNode head) {
        ListNode node = new ListNode(0); // 頭結點
        node.next = head;

        // p指向新的鏈表的尾結點
        ListNode p = node;
        ListNode tmp;

        // 每兩個進行操作
        while (p.next != null && p.next.next != null) {
            // 記錄下一次要進行處理的位置
            tmp = p.next.next;
            // 下面三句完成兩個結點交換
            p.next.next = tmp.next;
            tmp.next = p.next;
            p.next = tmp;
            // 指向返回鏈表的新的尾結點
            p = tmp.next;
        }

        head = node.next;
        node.next = null;

        return head;
    }
}

使用遞歸方法:

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
public class Solution {
    public ListNode swapPairs(ListNode head) {
        if (head == null || head.next == null) return head;
        ListNode second = head.next;
        ListNode third = second.next;
        
        second.next = head;
        head.next = swapPairs(third);
        
        return second;
    }
}

技術分享圖片

三、總結

遇到這樣的問題,我們可以從多個角度去考慮,找到便於理解並且可行的算法。

乘風破浪:LeetCode真題_024_Swap Nodes in Pairs