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.
这么做运算量小很多, 也比较不会出错。