題目
給定一個鏈表,兩兩交換其中相鄰的節點,並返回交換後的鏈表。
示例:
給定 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;
}