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.
Source
/**
* 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) { //移动的两个指针要分别指向要换的两个元素
if(head == null || head.next == null) return head; //注意空集和只有一个元素时
ListNode p = head.next, q, st;
head.next = p.next;
p.next = head;
q = head.next;
head = p;
q = head.next;
while(q.next != null && q.next.next != null){ //一次移两步,保证奇数链表最后一个元素不移动 注意判断next。next必须要先判断next
st = q;
p = p.next.next;
q = q.next.next;
p.next = q.next;
q.next = p;
st.next = q;
q = p;
p = st.next;
}
return head;
}
}
Test
public static void main(String[] args){
ListNode a = new ListNode(1);
a.next = new ListNode(2);
a.next.next = new ListNode(3);
a.next.next.next = new ListNode(4);
a.next.next.next.next = new ListNode(5);
ListNode b = new Solution().swapPairs(a);
while(b != null){
System.out.println(b.val);
b = b.next;
}
}