05 August 2008
Given a linked list, swap every two adjacent nodes and return its head.
Example:
1
Given 1->2->3->4, you should return the list as 2->1->4->3.
Note:
给一个链表,两两交换位置,每次跳两位,比如第一结点和第二结点交换位置,但第二结点和第三结点就不必交换位置,如果是单数个结点,就剩一个;要求空间为常数,所以如果用递归,先递归到最后一个结点,然后和倒数第二个交换的这种办法,因为空间是O(n)所以不行。另外也不能通过改变value的值来“交换”,只能交换结点。
时间复杂度O(n)。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode swapPairs(ListNode head) {
ListNode dummy = new ListNode(-1);
dummy.next = head;
ListNode current = dummy;
while (current.next != null && current.next.next != null) {//current的后两位进行交换
ListNode first = current.next;
ListNode second = current.next.next;
first.next = second.next;//将第一个结点next指向第二个结点的next
current.next = second;//将前面dummy或者已经交换过的结点(head)指向正在交换的的第二个结点
current.next.next = first;//将“head”指向原本的第一个结点
current = current.next.next;//让“head”跳两位
}
return dummy.next;
}
}
递归的办法是先遍历到链表末尾,先交换最后两个,依次向前;空间复杂度不符合题目要求,但是依然可以过test cases。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode swapPairs(ListNode head) {
if (head == null) {
return null;
}
if (head.next == null) {
return head;
}
ListNode n = head.next;
head.next = swapPairs(head.next.next);//每次跳两位递归
n.next = head;
return n;
}
}