LeetCode第24题两两交换链表中的节点

继续打卡算法题,今天学习的是LeetCode的第24题两两交换链表中的节点,这道题目是道中等题。算法题的一些解题思路和技巧真的非常巧妙,每天看一看算法题和解题思路,我相信对我们的编码思维和编码能力有一些帮助。

分析一波题目

这道题目很容易理解,容易读懂题意,我们只要掌握诀窍,通过前驱节点指向后续两个需要交换的节点,不断移动前驱节点,只要前驱节点的后面两个节点都存在,就执行交换,并移动前驱节点。

我们可以构造一个虚节点,指向头节点。第一次前驱节点等于虚拟节点

编码实现

java 复制代码
/**
 * 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 || head.next == null) {
            return head;
        }
        //虚拟节点
        ListNode dumy = new ListNode();
        dumy.next = head;
        ListNode pre = dumy;
        while(pre.next != null && pre.next.next != null ) {
           
           //获取两个待交换位置的两个节点
           ListNode node1 =   pre.next;
           ListNode node2 =   pre.next.next;
           node1.next = node2.next;
           node2.next = node1;
           // 头节点替换 这里是关键,这里要想通,前驱节点每次都必须更新 pre前面的节点和新的后继节点关联上。
           pre.next = node2;
           pre = node1;
           
        }
        return dumy.next;
    }
}

总结

题意容易理解的题目,我们主要是注意细节,这道题目,交换链表节点需要考虑几个点:

1、两个节点交换,交换之后两个节点后续的节点已经天然关联上了。

2、第一个节点前的节点,需要和交换后的后继节点关联上

相关推荐
春日见43 分钟前
丝滑快速拓展随机树 S-RRT(Smoothly RRT)算法核心原理与完整流程
人工智能·算法·机器学习·路径规划算法·s-rrt
Code小翊43 分钟前
”回调“高级
算法·青少年编程
云里雾里!1 小时前
力扣 977. 有序数组的平方:双指针法的优雅解法
算法·leetcode·职场和发展
WYiQIU1 小时前
11月面了7.8家前端岗,兄弟们12月我先躺为敬...
前端·vue.js·react.js·面试·前端框架·飞书
w***74401 小时前
SpringBoot项目如何导入外部jar包:详细指南
spring boot·后端·jar
tsumikistep3 小时前
【前后端】接口文档与导入
前端·后端·python·硬件架构
码事漫谈4 小时前
为什么C语言拒绝函数重载?非要重载怎么做?
后端
一只侯子4 小时前
Face AE Tuning
图像处理·笔记·学习·算法·计算机视觉
码事漫谈4 小时前
浅谈C++与C语言二进制文件差异(从一次链接错误说起)
后端
jianqiang.xue4 小时前
别把 Scratch 当 “动画玩具”!图形化编程是算法思维的最佳启蒙
人工智能·算法·青少年编程·机器人·少儿编程