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我一開始見到是一臉懵逼的,完全沒有什么思路。
那么要怎么推理出這道題的解法呢逼争?叶骨?匹层?
假設(shè): A->B->C->D 這個(gè)List
先不考慮代碼怎么寫(一想到代碼 通常會(huì)覺得很復(fù)雜 想不下去)
如果我們從A出發(fā)极谊,每次把第二個(gè)Node指向第一個(gè)Node六敬,B-->A , 然后讓第一個(gè)Node指向第三個(gè)Node碘赖。 B->A->C->D. 然后跑到C 重復(fù)上述。最后把B那個(gè)Node返回去這樣似乎就是一個(gè)合理的swaped list.?
這樣做的操作性是可以外构, 但是RunTime上面會(huì)比較慢一些因?yàn)闀?huì)有一些多余的condition check崖疤。
為什么要check?因?yàn)?每一次cur Node 更新典勇, 必須要指向第4個(gè)node然后跳到第3個(gè)Node劫哼。 比如B-A-C-D, ?cur本來在A,cur.next 要指向D割笙, ? 然后cur update到 C权烧。 因?yàn)?最后要達(dá)成B-A-D-C, A必須連到D。 這個(gè)思維運(yùn)算量很大伤溉,也很容易寫錯(cuò)般码。?
所以比較好的辦法是:設(shè)立一個(gè)Fake Node
fake -A-B-C-D ? ? 因?yàn)槊恳淮?update是把接下去的兩個(gè)Node位置swap, 所以 cur永遠(yuǎn)站在接下去的兩個(gè)Node前頭,操作后面兩個(gè)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.
這么做運(yùn)算量小很多板祝, 也比較不會(huì)出錯(cuò)。