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 Solution {
public ListNode swapPairs(ListNode head) {
if(head == null) return null;
if(head.next == null) return head;
ListNode temp = head.next;
head.next = head.next.next;
temp.next = head;
head.next = swapPairs(head.next.next);
return temp;
}
}
稍加整理后如下:
public class Solution {
public ListNode swapPairs(ListNode head) {
if(head == null || head.next == null) return head;
ListNode temp = head.next;
head.next = swapPairs(head.next.next);
temp.next = head; //temp.next赋值位置与上面有所不同,否则会死循环
return temp;
}
}
非递归
代码如下:
public class Solution {
public ListNode swapPairs(ListNode head) {
if(head == null || head.next == null) return head;
ListNode temp1 = head;
ListNode temp2 = temp1.next;
ListNode pre = null; //前引节点
ListNode root = head.next;
while(temp1 != null && temp1.next != null) {
temp1.next = temp2.next;
temp2.next = temp1; //改变当前两个节点的next
pre = temp1; //保存第一节点,第一节点将在下个循环成为前引节点
temp1 = temp1.next;
if(temp1 == null) { //若后面没有节点,说明到尾巴了
break;
} else {
temp2 = temp1.next;
pre.next = (temp2==null)?temp1:temp2; //判断下个循环的第二节点是否为空,避免前引节点指向空
}
}
return root;
}
}