Link: https://oj.leetcode.com/problems/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.
Your algorithm should use only constant space. You may not modify the values in the list, only nodes itself can be changed.
我的思路:没有思路。只知道要涉及多个节点的操作。但不知道怎么做。难。再做。
Approach I: Recursion
用两个pointer: next, next.next
public class Solution {
public ListNode swapPairs(ListNode head) {
if(head == null || head.next == null) return head;
ListNode next = head.next;
ListNode nextnext = head.next.next;
head.next = swapPairs(nextnext);//return the head of the pair: nextnext, nextnext.next
next.next = head;
return next;//return the head of the pair: nextnext, nextnext.next
}
}
Approach II: Iterative
Time: O(n), Space: O(1)
用三个Pointer, pre, cur, next。 每一次while loop只swap一个pair。
dummy->1->2->3->4
dummy->2->1->3->4
dummy->2->1->4->3
而不是一步到位到dummy->2->1->4->3
public class Solution {
public ListNode swapPairs(ListNode head) {
if(head == null || head.next == null) return head;
ListNode dummy = new ListNode(-1);
dummy.next = head;
ListNode pre = dummy;
ListNode cur = head;
ListNode next = cur.next;
while(next != null){
pre.next = next;
cur.next = next.next;
next.next = cur;
pre = cur;
cur = cur.next;
next = cur == null ? null : cur.next;
}
return dummy.next;
}
}
Note: 什么时候会用dummy?
当表头可能改变的时候。不然表头就没了。