题目地址:
https://www.lintcode.com/problem/swap-nodes-in-pairs/description
给定一个链表,要求每两个node调换一下。如果链表有奇数个节点,则最后一个不用调换。开一个函数,参数是需要调换的两个node之前的那个node,返回值是调换完时靠后的那个node,这样就可以反复用这个函数把整个链表操作一遍。代码如下:
public class Solution {
/**
* @param head: a ListNode
* @return: a ListNode
*/
public ListNode swapPairs(ListNode head) {
// write your code here
ListNode dummy = new ListNode(0);
dummy.next = head;
ListNode prev = dummy;
while ((prev = swapTwo(prev)) != null) {
}
return dummy.next;
}
// 调换prev之后的两个node
private ListNode swapTwo(ListNode prev) {
// prev -> n1 -> n2 -> tail
if (prev.next == null || prev.next.next == null) {
return null;
}
ListNode n1 = prev.next, n2 = prev.next.next;
ListNode tail = n2.next;
n1.next = tail;
n2.next = n1;
prev.next = n2;
return n1;
}
}
class ListNode {
int val;
ListNode next;
ListNode(int x) {
val = x;
}
}
时间复杂度 O ( n ) O(n) O(n),空间 O ( 1 ) O(1) O(1)。