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.
翻译 :给定一个链表,调换每两个相邻节点,并返回其头部。 例如, 给定 1->2->3->4, 你应该返回的链表是 2->1->4->3。 你的算法必须使用唯一不变的空间。 你也不能修改列表中的值,只有节点本身是可以改变的。
/**
*
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class S24 {
public static void main(String[] args) {
ListNode n1 = new ListNode(1);
ListNode n2 = new ListNode(2);
n1.next = n2;
ListNode n3 = new ListNode(3);
n2.next = n3;
n1.print();
ListNode head = swapPairs(n1);
head.print();
}
public static ListNode swapPairs(ListNode head) {
if(head == null){
return null;
}
// 当只有一个元素的情况
if(head.next == null){
return head;
}
ListNode i = head; // i指向第1个
ListNode j = i.next; // j指向第2个
ListNode k = j.next; // k指向第3个
head = head.next;
while(j != null){
j.next = i;
if(k!=null && k.next!=null){ // 当有偶数个节点
i.next = k.next;
}else{ // 当有奇数个节点
i.next = k;
}
// 更新i,j,k的值,前进两格
i = k;
if(k != null){
j = k.next;
}else{
j = null;
}
if(k!=null && k.next!=null){
k = k.next.next;
}else{
k = null;
}
}
return head;
}
}