題意:給定一個鏈表,交換相鄰的兩個結點,返回交換之後的頭結點。
例子:給定鏈表 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;
}
}