这道题居然自己用递归完整些出来了
而且稍微有了一些关于递归的思路
代码:
/**
* 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; }
* }
*/
//牛逼了 第一次递归写的正确率 54/55
class Solution {
ListNode linked=new ListNode();
public ListNode swapPairs(ListNode head) {
//偶数位 每两个交换一下 奇数个 尾结点不变
if(head==null) return null;
if(head.next==null) return head;
head=swap(head,head.next);
return head;
}
//交换部分
public ListNode swap(ListNode head,ListNode nextnode){
/**中断条件 */
if(head==null) return null;
if(nextnode==null) return head;
//交换
ListNode tem=nextnode.next;
nextnode.next=head;
head.next=tem;
//更新位置————>再次进入循环
/*head=head.next;
nextnode=head.next;*/
if(head.next!=null){
head.next=swap(head.next,head.next.next);
}
//返回值
return nextnode;
}
}
首先明白一点是:递归虽然会先给你返回最后一次递归的值
但是!它的返回结果会连接倒数第二次的
即表面上 一个链表你用递归处理,虽然看上去先返回最后一次递归的值,但返回值会依次向上叠加。
递归的四个部分
中断条件:
这种一般是递归结束的标志如空值,这里还会考虑递归到最后一个,应该返回啥
处理部分:
根据实际要求来
更新位置,再次进入递归
返回值:
每次递归的返回值,他会按逻辑顺序输出,而不会倒序输出。
评论区大佬解法: