24. Swap Nodes in Pairs
題目
給出一個鏈表,交換每兩個相鄰的結點,並返回它的頭結點。
比如:
給出 1->2->3->4, 你應該返回 2->1->4->3.
注意:
你的算法應該只用常數額外空間。
你可能並不修改列表結點的值,僅改變節點本身。
代碼塊
/**
* 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;
}
}
代碼分析
本題剛開始沒有思路,debug一遍後才慢慢理清思緒。
本題的重點是要分析循環結束的條件。
1.首先設置三個結點;
還要注意邊界條件。以及設定啞變量(頭結點位置會改變)。
2.然後滿足條件的進行循環;(包含圖中步驟1-6)
在循環中,先交換位置,然後將三個結點進行移位。
3.最後,做收尾處理。(包含圖中步驟7-9)
做鏈表的題目時一定注意,要畫一下位置,不然容易混亂。
步驟1,2,3是交換結點,4,5,6是將三個結點進行移位,7,8,9是做收尾處理。