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.


这么做运算量小很多, 也比较不会出错。

你可能感兴趣的:(List:swap Nodes in Pairs)