判断比较花时间,需要分奇数个节点和偶数个节点的情况
package Level2;
import Utility.ListNode;
/**
* 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.
*
*/
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;
}
}