leetcode題解-24. Swap Nodes in Pairs

題意:給定一個鏈表,交換相鄰的兩個結點,返回交換之後的頭結點。

例子:給定鏈表 1->2->3->4, 返回鏈表 2->1->4->3.

分析:關鍵在於分析循環的結束條件。以例子來說明:
設置三個指針pre,leftNode,secondNode。初始值如下,
pre = dummyNode;
leftNode= 節點1;
secondNode = 節點2;

循環條件爲while(right.next != null && right.next.next != null),即判斷節點3和節點4是否爲空節點,如果有一個爲空節點,那麼節點1和節點2也不swap;如果節點3和節點4都不爲空節點,那麼節點1和節點2進行swap。然後將firstNode和secondNode後移到節點2和節點4。
在本例中,節點4的next爲空,所以節點3和節點4不爲空,所以在循環外做收尾處理,即將節點3和節點4進行swap。

那麼,代碼爲:

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode swapPairs(ListNode head) {
        if(head == null || head.next == null) return head;
        ListNode fakeHead = new ListNode(0); 
        fakeHead.next = head;
        ListNode pre = fakeHead;
        ListNode left = head;
        ListNode right = head.next;
        while(right.next != null && right.next.next != null){
            left.next = right.next;
            right.next = left;
            pre.next = right;
            left = left.next;
            right = right.next.next.next;
            pre = pre.next.next;
        }
        left.next = right.next;
        right.next = left;
        pre.next = right;
        return fakeHead.next;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章