LeetCode24两两交换链表中的节点(java实现)

今天来分享的题目是Leetcode上的24题,首先我们来看下题目描述。

这里我们注意题目的要求是交换的是两个节点,而并非是交换节点中的值 。

我们的解题思路如下:

首先是定义一个虚拟头结点vir,这样方便我们操作第一个头结点,虚拟头结点vir.next指向的是头节点,起初头结点是指向的节点1 ,那么我们想要做的是让vir指向节点2 ,然后让节点2指向节点1 ,让节点1指向节点3 ,这样就完成了节点1和节点2的交换。

那么具体的实现代码如下:

java 复制代码
 public ListNode swapPairs(ListNode head) {
        ListNode vir=new ListNode();
        //定义虚拟头结点
        vir.next=head;
        ListNode cur =vir;
        while (cur.next!=null&&cur.next.next!=null){
            //定义临时变量存放cur.next和cur.next.next
            ListNode tem=cur.next;
            ListNode tem1=cur.next.next.next;
            //交换第一和第二个节点
          cur.next=cur.next.next;
          cur.next.next=tem;
          //让节点1的.next指向节点3
        tem.next=tem1;
        //移动cur进行下一步的交换,cur始终指向的是欲要进行操作的节点的前一个节点。
        cur=cur.next.next;


        }
        //将vir.next返回,无论节点如何变化vir.next永远指向头结点。
    return vir.next;

    }

我们来结合代码进行进一步的分析,首先是我们的while循环,while循环中的两个判断条件分别是对当链表中的节点为奇数时的怕判断条件以及当链表中的节点为偶数时的判断条件,那么为什么cur.next!=null&&cur.next.next!=null

中间的判断不是||而是&&呢?并且是cur.next!=null的判断在前,cur.next.next的判断条件在后,这是因为&&是两个条件都满足才会真,而||是一真便真,如果cur.next.next!=null放在前面会导致程序陷入死循环。所以这个两个条件的判断前后顺序是不能变的 。

需要注意的点是,在进行节点交换之前,需要对节点的位置用临时变量进行存储 ,例如上图中的,我们需要先将节点1和节点3进行存储后,方便后续的交换。

那么本期的算法题目思路以及代码的分享就到这里结束了,如果觉得博主写的对你有帮助,创作不易,希望帮博主点一个小爱心♥♥♥谢谢!(●ˇ∀ˇ●)

相关推荐
专业程序开发源4 分钟前
springboot欧缇蔓月子中心管理系统82697-计算机课程设计、毕业设计
java·spring boot·后端·python·spring·django·课程设计
秋天的怀念_David22 分钟前
算法一千零一夜 · 第十四夜 幻方与奇妙的二进制
java·程序人生·算法
thefool11226626 分钟前
网络编程^
java
Thinker QAQ1 小时前
并发编程(十一):Shared Memory 与 Message Passing——关系与组合使用
java·python·go·并发编程·shared memory·message passing
齐 飞1 小时前
idea中git误操作撤回git reset --hard ‘HEAD@{1}‘
java·git·intellij-idea
你的保护色2 小时前
多AS互联BGP4综合实验设计
java
某不知名網友2 小时前
ROS2进阶:服务通信、自定义SRV接口、参数服务器与基于服务的参数通信详解
java·开发语言·microsoft
Wang's Blog2 小时前
Java 项目实战: 交友项目 - MongoDB 入门:体系结构和命令行操作
java·mongodb·交友
小溪学编程2 小时前
将 Bean 放入 Spring 容器中的方式有哪些?
java·后端·spring
java_nnnn2 小时前
LeetCode刷题滑动窗口(水果成篮+找到字符串中所有字母的异位词)Java
java·开发语言·leetcode