两两交换链表中的节点
给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
示例 1:
输入:head = [1,2,3,4] 输出:[2,1,4,3]
示例 2:
输入:head = [] 输出:[]
示例 3:
输入:head = [1] 输出:[1]
提示:
链表中节点的数目在范围 [0, 100] 内 0 <= Node.val <= 100
解决
这个题目时要返回我们两两交换后最终的头节点
使用递归的方法
默认链表长度是偶数,完成后再考虑长度为奇数的情况
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
//两个两个为一组
public ListNode swapPairs(ListNode head) {
//长度为偶数,没有下一节点;递归的中止条件
if(head==null)
return null;//定义三个指针
ListNode left=head;//两两的左1
ListNode right=left.next;//两两的右2
ListNode next=right.next;//两两的右的下一节点3
//说明链表长度为奇数,我们只返回左指针就行了,正常是返回右指针;也是我们递归的中止条件
if(right==null)
return left;
//由原本的左指右,变为右指左
right.next=left;//会先执行到链表的最尾端,即便next是空我们也会传进去,执行方法顶部的if判断再返回;用于接收各层递归返回回来的右节点
next=swapPairs(next);//递归回来再让左指针指向返回回来的"下一个两两组合的右节点"
left.next=next;
return right;
}
}