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.
Really a hard one for me, because I am not sure the pointers direction...
1. new ListNode p, p.next = head;
2. two pointers, curr= head; prev = p;
3. when loop begin, two pointers to track pair: first and second.
Failed with recursion way...
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
/* public ListNode swapPairs(ListNode head) {
ListNode p = new ListNode(0);
p.next = head;
swapParis(p);
return p.next;
}
public ListNode swapParis(ListNode n){
if(n == null || n.next == null || n.next.next==null){
return n;
}
ListNode tmp = n.next.next;
ListNode ptmp = n.next;
n.next.next = n;
n.next = swapPairs(tmp);
return ptmp;
}
*/
public ListNode swapPairs(ListNode head){
ListNode p = new ListNode(0);
p.next = head;
ListNode prev = p;
ListNode curr = head;
if(head==null || head.next == null){
return p.next;
}
while(curr!=null && curr.next!=null){
ListNode first = curr;
ListNode second = curr.next;
curr = curr.next.next;
prev.next = second;
second.next = first;
first.next = curr;
prev = first;
}
return p.next;
}
}