List:swap Nodes in Pairs

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.


這么做運算量小很多, 也比較不會出錯。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容