首页 > 其他分享 >图解LeetCode——24. 两两交换链表中的节点

图解LeetCode——24. 两两交换链表中的节点

时间:2023-05-25 13:31:29浏览次数:42  
标签:24 p2 head ListNode next 链表 节点 LeetCode Node

一、题目

给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。

二、示例

2.1> 示例 1:

输入】head = [1,2,3,4]<br> 【输出】[2,1,4,3]

2.2> 示例 2:

输入】head = []<br> 【输出】[]

2.3> 示例 3:

输入】head = [1]<br> 【输出】[1]

提示:

  • 链表中节点的数目在范围 [0, 100]
  • 0 <= Node.val <= 100

三、解题思路

3.1> 思路1:遍历交换

根据题目描述,我们需要两两交换节点,然后将最终交换后的链表的头节点返回回来。那么第一个解题思路就是我们通过遍历链表中的节点,然后进行交换操作。为了方便起见,我们可以在原链表的头节点前面再创建一个虚拟节点Node(-1),然后创建两个指针p1p2p1指向虚拟节点,p2指向原链表的头节点(即:Node(-1)next节点),这样,我们就可以通过一下逻辑实现节点交换了,以输入head = [1,2,3,4,5]为例,即:

步骤1】通过调用ListNode t = p2.next.next暂存Node(3)节点;<br> 【步骤2】通过调用p1.next = p2.next来将Node(-1)链接到Node(2)节点;<br> 【步骤3】通过调用p2.next.next = p2来将Node(2)链接到Node(1)节点;<br> 【步骤4】通过调用p2.next = t来将Node(1)链接到Node(3)节点;<br> 【交换结果】此时链表就变为了Node(-1)——>Node(2)——>Node(1)——>Node(3)——>……了。

执行了一次两个相邻节点交换操作之后,我们需要同时移动p1p2指针,即:

移动p2指针p2 = p2.next;<br> 【移动p1指针p1 = p1.next.next;

以上就是本题的解题思路,为了方便大家理解,我们以输入为 head = [1,2,3,4,5] 为例,来看一下具体的操作流程。请见下图所示:

3.2> 思路2:递归交换

我们除了思路一的解题方式之外,还可以通过递归的方式进行解题,其实具体思路跟思路1是极其相似的,只是写法的差异而已,此处就不再赘述和画图了,具体的解题请见下方实现2的代码部分即可。

四、代码实现

4.1> 实现1:遍历交换

class Solution {
    public ListNode swapPairs(ListNode head) {
        ListNode temp = new ListNode(-1, head);
        ListNode p1 = temp, p2 = head;
        while(p2 != null && p2.next != null) {
            ListNode t = p2.next.next;
            p1.next = p2.next;
            p2.next.next = p2;
            p2.next = t;
            p2 = p2.next;
            p1 = p1.next.next;
        }
        return temp.next;
    }
}
/**
 * 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; }
 * }
 */

4.2> 实现2:递归交换

class Solution {
    public ListNode swapPairs(ListNode head) {
        if (head == null || head.next == null) return head;
        ListNode newHead = head.next;
        head.next = swapPairs(head.next.next);
        newHead.next = head;
        return newHead;
    }
}

今天的文章内容就这些了:

写作不易,笔者几个小时甚至数天完成的一篇文章,只愿换来您几秒钟的 点赞 & 分享

更多技术干货,欢迎大家关注公众号“爪哇缪斯” ~ \(^o^)/ ~ 「干货分享,每天更新」

标签:24,p2,head,ListNode,next,链表,节点,LeetCode,Node
From: https://blog.51cto.com/u_15003301/6346884

相关文章

  • 畜牧业有源卡标签芯片-SI24R2F+
    畜牧保险标的身份识别系统是基于有源RFID技术通过耳标对牛羊等畜牧养殖进行全生命周期管理,有源RFID动物芯片提供牛羊唯一身份标识,配合RFID手持终端对牛羊的身份进行识别,不仅可以实现牛羊养殖过程的跟踪溯源管理,而且当发生养殖保险理赔时保险公司可快速核实参保标的身份,精准识......
  • 路径总和 leetcode——递归+回溯
    题目leetcode:113代码与解析这道题可以看做leetcode112和leetcode257合体这道题要遍历整棵树,把所有符合条件的路径添加进去,所以不需要返回值递归三部曲:确定参数和返回值要传入当前节点,和总和,不需要返回值确定终止条件如果当前节点没有叶子结点,并且和等于target.那么添加进r......
  • SSO2.0 9-20230524
              ......
  • 2023-5-24
    忙碌结束的结束了两个ddl,看完了《刑事ZERO》嗯,,忘了还有啥评价是还算快乐评价是德语难念(虽然就是个书名未结束的后面要处理的事情大概就是人工智能,机器人和GameJam(中间一个CSP应该做点别的事情了,这两天《夜の向日葵》也练到了难点发现口琴还是需要下功夫练的看《LegalHi......
  • #yyds干货盘点# LeetCode程序员面试金典:路径总和
    题目:给你二叉树的根节点 root和一个表示目标和的整数 targetSum。判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和 targetSum。如果存在,返回true;否则,返回false。叶子节点是指没有子节点的节点。 示例1:输入:root=[5,4,8,11,null,13,4,......
  • #yyds干货盘点# LeetCode程序员面试金典:Excel表列名称
    1.简述:给你一个整数 columnNumber,返回它在Excel表中相对应的列名称。例如:A->1B->2C->3...Z->26AA->27AB->28... 示例1:输入:columnNumber=1输出:"A"示例2:输入:columnNumber=28输出:"AB"示例3:输入:columnNumber=701输出:"ZY"示例4:输入:colum......
  • 2023/5/24每日随笔 项目基本实现
    今天,上了几节课,然后进行项目的完善与基本实现一:实现了调用相册,将地址提取二:实现了图片提取加分类三:实现了添加后更新四:结果展示五:项目问题以及可能出现bug一:实现了调用相册,将地址提取具体更改的这个方法:完整代码来自《第一行代码》调用相册和使用相机。更改后调用的相册可......
  • 5.24
    题目描述:定义一个时间类,小时和分钟是其两个私有成员数据。输入一个起始时间和一个结束时间(起始时间早于结束时间),通过运算符重载-(减号),计算这两个时间相隔多少分钟。说明:这两个时间在同一天之内,且采用24小时计时分式,即从00:00-23:59。输入格式:测试输入包含若干测试用例,每......
  • 5.24每日总结
      今天完成了python的一个餐厅点餐系统。  功能:实现菜品的添加、修改、删除,订单的增加、删除、清空,计算总价。     ......
  • 5.24 3.2
    一、问题如果整数A的全部因子(包括1,不括A本身)之和等于B;且整数B的全部因子(包括1不包括B本身)之和等于A,则将整数A和B称为亲密数。求3000以内的全部亲密数。二、分析根据问题描述,该问题可以转化为:给定整数A,判断A是否有亲密数。为解决该问题,首先定义变量a,并为......