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.
关于list的操作,下面是我的错误答案,input [1,2],output[1],excepted[2,1]。
public class Solution {
public ListNode swapPairs(ListNode head) {
if (head == null) {
return null;
}
ListNode headlist = new ListNode(0);
ListNode templist = new ListNode(0);
headlist.next = head;
while (head.next != null) {
templist.next = head.next.next;
head.next.next = head;
head.next = templist.next;
head = head.next;
if (head == null) {
break;
}
if (head.next == null) {
break;
}
}
return headlist.next;
}
}
下面是正确的做法:
public ListNode swapPairs(ListNode head) {
ListNode dummy = new ListNode(0);
dummy.next = head;
ListNode current = dummy;
while (current.next != null && current.next.next != null) {
ListNode first = current.next;
ListNode second = current.next.next;
first.next = second.next;
current.next = second;
current.next.next = first;
current = current.next.next;
}
return dummy.next;
}
可以看到我是直接对形参head操作,而正确做法是新建current,first,second,对所有要用到的listnode都新建,暂时还不知道为什么这么做。
知道了,这里不可以改head,因为代码中把headlist.next设成head,就不要动head了,否则结果会错。不过上面的代码明显有个瑕疵:
public class Solution {
public ListNode swapPairs(ListNode head) {
ListNode headlist = new ListNode(0);
ListNode curlist = new ListNode(0);
headlist.next = head;
curlist = headlist;
while (curlist.next != null && curlist.next.next != null) {
ListNode first = curlist.next;
ListNode second = curlist.next.next;
first.next = second.next;
second.next = first; //这里应该改变第二个元素的next啊,不知道系统为什么认为不加也对
curlist.next = second;
curlist.next.next = first;
curlist = curlist.next.next;
}
return headlist.next;
}
}
这道题的递归解法也很奇妙,先记录下原本的head.next,然后head.next 其实应该等于swamPairs(head.next.next),然后把原本的head.next.next设成head,代码如下:
public class Solution {
public ListNode swapPairs(ListNode head) {
if ((head == null)||(head.next == null))
return head;
ListNode n = head.next;
head.next = swapPairs(head.next.next);
n.next = head;
return n;
}
}