leetcode 24. 两两交换链表中的节点

1、如果整个链表数量是偶数个,两两交换,第二个节点指向第一个节点,第二个节点后面的节点也需要保存,不然就断联系了,所以得保存3个节点,1 2 3,1 和 2 交换位置后,1得指向3,但是3也需要后3后面的那个4交换位置,所以1实际要指向4,可以发现,两两交换后,下一个要指向的元素就是下一个交换后的头节点,是一个递归的操作。1 2 3 4,1 2变成2 1后,1的next要变成下一次交换后的头节点,3 4 交换后就是4 3,所以1.next = 4,整体变成了2 1 4 3 ,3.next = 下一轮交换后的头节点。

2、写一个递归函数,交换两个节点后返回头节点。让头节点成为递归联系。

/**
 * 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) {
        return connect(head);
    }
    //互逆之后返回头节点
    public ListNode connect(ListNode root){
        if(root == null){
            return null;
        }
        //保存3个节点信息。实现互逆并且与下一个递归函数联系起来。
        ListNode left = root;
        ListNode mid = root.next;
        //如果是奇数的话,最后一个不用交换。直接作为头节点返回。
        if(mid == null){
            return root;
        }
        ListNode right = mid.next;
        // 1 2 变成了  2  1,1要指向下一轮交换的头节点。
        mid.next = left;
        left.next = connect(right);
        //返回头节点
        return mid;
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

失忆机器

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值