Given a linked list, swap every two adjacent nodes and return its head.
For example,
Given 1->2->3->4, you should return the list as 2->1->4->3.
這道題的recursive version解法還是比較簡單的。
iterative version我一開始見到是一臉懵逼的,完全沒有什么思路。
那么要怎么推理出這道題的解法呢???
假設: A->B->C->D 這個List
先不考慮代碼怎么寫(一想到代碼 通常會覺得很復雜 想不下去)
如果我們從A出發,每次把第二個Node指向第一個Node,B-->A , 然后讓第一個Node指向第三個Node。 B->A->C->D. 然后跑到C 重復上述。最后把B那個Node返回去這樣似乎就是一個合理的swaped list.?
這樣做的操作性是可以, 但是RunTime上面會比較慢一些因為會有一些多余的condition check。
為什么要check?因為 每一次cur Node 更新, 必須要指向第4個node然后跳到第3個Node。 比如B-A-C-D, ?cur本來在A,cur.next 要指向D, ? 然后cur update到 C。 因為 最后要達成B-A-D-C, A必須連到D。 這個思維運算量很大,也很容易寫錯。?
所以比較好的辦法是:設立一個Fake Node
fake -A-B-C-D ? ? 因為每一次 update是把接下去的兩個Node位置swap, 所以 cur永遠站在接下去的兩個Node前頭,操作后面兩個node就好。
ListNode current = dummy;
while (current.next != null && current.next.next != null) {
ListNode first = current.next;
ListNode second = current.next.next;
然后current跳到current.next.next.
這么做運算量小很多, 也比較不會出錯。