一、题目
给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
示例:
给定 1->2->3->4, 你应该返回 2->1->4->3.
二、思路
- 参数非空判断。头结点为空,则反空。头结点后继结点为空,则反头结点。
- 使用递归。输入为头结点及其两个后继结点,输出为头结点。
- 终止函数:判断两个后继结点是否为空。如果为空,则返回头结点。
- 分而治之。交换两个后继结点的位置,然后继续对后继结点调用递归函数。
- 递归需要返回每次传入的头结点,保证最后返回给主函数调用处的是整个链表的头结点。
- 初始值。头结点为null,所以在递归函数中还要做头结点是否为空的判断。
三、代码
public class Q024_swapPairs {
public ListNode swapPairs(ListNode head) {
if(head == null) return null;
if(head.next == null) return head;
return swap(null, head, head.next);
}
public ListNode swap(ListNode head, ListNode left, ListNode right){
if(right == null){
return head;
}
if(head != null){
head.next = right;
}
left.next = right.next;
right.next = left;
if(left.next == null || left.next.next == null) return head != null ? head : right;
left = swap(left, left.next, left.next.next);
return head != null ? head : right;
}
}