題目地址:https://leetcode-cn.com/problems/swap-nodes-in-pairs/
題目:
給定一個鏈表,兩兩交換其中相鄰的節(jié)點(diǎn)澎埠,并返回交換后的鏈表。
示例:
給定 1->2->3->4, 你應(yīng)該返回 2->1->4->3.
說明:
- 你的算法只能使用常數(shù)的額外空間暗甥。
- 你不能只是單純的改變節(jié)點(diǎn)內(nèi)部的值眷射,而是需要實(shí)際的進(jìn)行節(jié)點(diǎn)交換。
試題分析:
這道題看描述很簡單屡穗,但是真正動手寫起來還是有些難度的,因為涉及到多指針的操作忽肛,因為涉及到鏈表上節(jié)點(diǎn)的兩兩交換村砂,所以會涉及到3個節(jié)點(diǎn)的操作,當(dāng)前節(jié)點(diǎn)屹逛、前置節(jié)點(diǎn)础废、前置的前置節(jié)點(diǎn)。算法思路就是順序遍歷鏈表節(jié)點(diǎn)罕模,兩兩交換位置评腺,交換完成后需要進(jìn)行指針位置移動,做的過程中最好先畫圖搞清楚指針交換的過程再動手寫代碼淑掌。
代碼:
public ListNode swapPairs2(ListNode head) {
if(head==null || head.next==null){
return head;
}
//涉及到3個節(jié)點(diǎn)操作蒿讥,前置節(jié)點(diǎn)、前置前置節(jié)點(diǎn)、當(dāng)前節(jié)點(diǎn)
ListNode cur = head.next;
ListNode prev = head;
ListNode prevPrev = null;
head = head.next;
while(prev!=null && cur!=null){
//當(dāng)前交換節(jié)點(diǎn)非空則交換cur和prev
prev.next = cur.next;
cur.next = prev;
//記錄前置前置節(jié)點(diǎn)為當(dāng)次排序第二個節(jié)點(diǎn)芋绸,用于下次交換
prevPrev = prev;
if(prev.next!=null && prev.next.next!=null) {
prev = prev.next;
cur = prev.next;
prevPrev.next = cur;
}else {
break;
}
}
return head;
}
源碼路徑:com.monkey01.linkedlist.SwapNodesInPairs_24
配套測試代碼路徑:test目錄com.monkey01.linkedlist.SwapNodesInPairs_24Test