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.
/**
* 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) {
// Start typing your Java solution below
// DO NOT write main() function
ListNode oddNode = head;
if(oddNode==null)
return head;
ListNode evenNode = head.next;
if(evenNode==null)
return head;
oddNode.next = evenNode.next;
evenNode.next = oddNode;
ListNode prev = oddNode;
head = evenNode;
while(prev.next!=null && prev.next.next!=null){
oddNode = prev.next;
evenNode = prev.next.next;
// start swapping
oddNode.next = evenNode.next;
evenNode.next = oddNode;
prev.next = evenNode;
prev = oddNode;
}
return head;
}
}
------------------------------------------------------------------------------------------------------------------------------------------
LL's solution:
/**
* 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) {
// Start typing your Java solution below
// DO NOT write main() function
//emply list or single node list
if(head==null || head.next == null)
return head;
// 2 or more nodes
ListNode dummy = new ListNode(0);
dummy.next = head;
ListNode runner = dummy;
ListNode a = head;
ListNode b = a.next;
ListNode c = b.next;
head = b;
while(a!=null && b!=null){
// swap
runner.next = b;
b.next = a;
a.next = c;
// move pointer
runner = a;
a = a.next;
if(a!=null){
b = a.next;
if(b!=null)
c = b.next;
}
}
return dummy.next;
}
}