- 两两交换链表中的节点
给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
示例 1:
输入:head = [1,2,3,4]
输出:[2,1,4,3]
示例 2:
输入:head = []
输出:[]
示例 3:
输入:head = [1]
输出:[1]
提示:
链表中节点的数目在范围 [0, 100] 内
0 <= Node.val <= 100
代码:
class Solution {
public ListNode swapPairs(ListNode head) {
if (head == null) {
return null;
}else if (head.next == null){
return head;
}else {
ListNode left = new ListNode();
left.next = head;
exchangeNode(left, left);
return left.next;
}
}
private ListNode exchangeNode(ListNode head, ListNode left) {
if (left.next == null || left.next.next == null) {
return head;
}
//保留不交换的后续节点
ListNode tmp = left.next.next.next;
//切断不交换的后续节点
left.next.next.next = null;
ListNode current = left.next;
ListNode right = left.next.next;
//current节点和right节点交换位置
left.next = right;
right.next = current;
//后续节点接上
current.next = tmp;
//递归
exchangeNode(head, left.next.next);
return head;
}
}
//链表节点
class ListNode {
int val;
ListNode next;
ListNode() {}
ListNode(int val) { this.val = val; }
ListNode(int val, ListNode next) { this.val = val; this.next = next; }
}