轻触节点,链表里的悄然邂逅

news2024/10/18 17:08:31

在这里插入图片描述

公主请阅

  • 1. 移除链表元素
    • 1. 题目说明
      • 示例 1
      • 示例 2
      • 示例 3
    • 1.2 题目分析
    • 1.3 代码部分
    • 1.4 代码解析
  • 2. 反转链表
    • 2. 1题目说明
      • 示例 1
      • 示例 2
      • 示例 3
    • 2.2 题目分析
    • 2.3 代码部分
    • 2.4 代码分析

1. 移除链表元素

在这里插入图片描述
题目传送门


1. 题目说明

给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。

示例 1

在这里插入图片描述

输入:head = [1,2,6,3,4,5,6], val = 6
输出:[1,2,3,4,5]


示例 2

输入:head = [], val = 1
输出:[]


示例 3

输入:head = [7,7,7,7], val = 7
输出:[]


1.2 题目分析

题目给了我们一个链表,要求说让我们将值等于val的链表删除,并且返回新的头结点
那么这个题我们该怎么进行解决呢?
我的想法是:我们可以通过设置一个哨兵位然后利用双指针进行链表的遍历,然后我们的两个指针如果在遍历过程中遇到了满足条件的节点的话,我们直接忽略了,将这个节点的前一个节点的next的指针进行改变,指向这个节点的下一个节点,通过这种方法我们间接的将这个节点删除了


1.3 代码部分

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode* removeElements(struct ListNode* head, int val)
{
    //创建一个哨兵节点(tmp),哨兵节点的next指针指向头结点
    struct ListNode*tmp=(struct ListNode*)malloc(sizeof(struct ListNode));
    tmp->next=head;

    //双指针
    struct ListNode*prev=tmp;//慢指针--当前节点的前一个节点,从哨兵卫开始
    struct ListNode*cur=head;//快指针遍历链表的当前节点,从头结点开始

    //遍历整个链表
    while(cur!=NULL)
    {
        if(cur->val==val)//如果当前节点的值等于val的话,那么我们就跳过当前节点
        {
            prev->next=cur->next;//当前遍历的节点的前一个节点的next将会直接指向当前节点的下个节点
            //就是说直接将当前节点忽略掉了
        }
        else//当前节点的值不等于val,那么我们继续往后移动
        {
            //移动prev
            prev=cur;
        }
        cur=cur->next;
    }
    //循环结束了,那么这个满足条件的节点就删除了

    //重新定义头结点,将哨兵卫忽略就行了
    struct ListNode*newHead=tmp->next;//用指针将头节点进行定义
    free(tmp);//释放哨兵卫
    return newHead;//返回我们之前保存的头结点的指针
}


1.4 代码解析

我们先利用malloc动态申请一个节点赋值给tmp,这个tmp就是我们所说的哨兵位,用来占位子的
然后我们的tmpnext指针就指向我们原先的头结点了
然后我们再创建两个指针:

  • prev—慢指针,当前节点的前一个节点,从哨兵位开始
  • cur—当前节点,从头结点开始

说明:我们的这个哨兵位仅仅是一个空节点,并不存在实际的数据的,我们创建出来只是用来占位子的

然后我们就可以进行遍历整个链表的操作了
遍历的循环条件是我们的当前节点cur不是空,就是只要到了尾节点我们就停下来了
我们在循环里面进行判断,如果当前节点的val满足条件的话,我们让这个节点的前一个节点指向这个节点的下一个节点,来达到间接删除当前的节点的作用
但是如果当前节点不满足的话我们就让prev这个指针赋值为cur
然后在这个while循环的结束位置,我们就进行移动的操作,进行链表节点的遍历操作
等循环结束了,我们这个链表中满足条件的val就间接被删除了
然后我们再重新定义头结点
头结点就是我们哨兵位的next指针指向的节点,这个时候我们的哨兵位的作用就发挥出来了
然后我们将哨兵位释放掉就行了,这个题就结束了


2. 反转链表

在这里插入图片描述
题目传送门


2. 1题目说明

这是 LeetCode 第 206 题:反转链表 的问题描述:

给定一个单链表的头节点 head,请你反转链表,并返回反转后的链表。

示例 1

  • 输入: head = [1,2,3,4,5]
  • 输出: [5,4,3,2,1]

示例 2

  • 输入: head = [1,2]
  • 输出: [2,1]

示例 3

  • 输入: head = []
  • 输出: []

限制条件

  • 链表中节点的数量范围是 [0, 5000]
  • -5000 <= Node.val <= 5000

2.2 题目分析

逆转链表顾名思义就是链表逆置
假设当前链表是1->2->3->4->5
逆置过后就是这个样子的5->4->3->2->1

那么我们怎么进行下面的操作呢?
我们还是使用双指针进行链表的遍历,关于这个逆置的操作我们在遍历的时候同时进行
同样是定义两个指针,然后在遍历的时候将当前的指向指向上一个节点,然后进行当前节点的改变,改变相邻两个节点的指针,随手遍历结束,我们的尾节点就变成了头结点,最后我们直接将头结点进行返回就行了
请看下面代码部分


2.3 代码部分

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode* reverseList(struct ListNode* head)
{
    struct ListNode*prev=NULL;//定义当前节点的前一个节点
    //因为反转后原始链表的头节点将成为新链表的尾节点,它的下一个节点应该指向 NULL。
    struct ListNode*cur=head;//用于遍历链表,从头结点开始

    while(cur!=NULL)//遍历链表
    {
        struct ListNode*nexttmp=cur->next;//保存当前节点的下一个节点

        //下面的两个代码就是对当前节点和当前节点的前面进行操作,进行指针逆转操作
        cur->next=prev;//当前节点的指针反转了,指向了前一个节点
        prev=cur;//当前节点变成了前一个节点了

        cur=nexttmp;//将cur移动到下一个节点的位置
    }
    //出了循环之后这个逆转操作就完成了
    return prev;//反转后的链表prev成为了新的头节点了
}

2.4 代码分析

我们先定义一个指针prev指向前一个节点,但是初始化我们设置为NULL,然后我们再定义一个指针cur指向当前的头节点head
然后我们使用while循环进行遍历链表,结束条件是遍历到尾节点就停止
我们在循环里面先定义一个指针nexttmp将当前节点的下个节点进行保存的操作
然后下面就是我们三个节点直接的指向变换了
我们让当前节点cur的下一个节点的指针next指向我们的前一个节点prev,然后我们让这个前一个节点prev变成我们的当前节点cur进行下一组相邻节点的逆置操作
然后我们让当前的cur变成我们当时保存的下一个节点的指针,我们现在对这两个节点进行逆置操作
随着循环结束,我们的最后prev就变成了新的头结点了
我们将这个节点返回操作就行了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2217913.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

无头浏览器测试:如何使用 Puppeteer 和 Browserless?

什么是无头浏览器测试&#xff1f; 无头浏览器测试通常指没有头的物体或东西&#xff0c;在浏览器的语境中&#xff0c;它指的是没有 UI 的浏览器模拟。无头浏览器自动化使用 Web 浏览器进行端到端测试&#xff0c;而无需加载浏览器的 UI。 无头模式是一个功能&#xff0c;它…

SpringBoot1~~~

目录 快速入门 依赖管理和自动配置 修改自动仲裁/默认版本号 starter场景启动器 自动配置 修改默认扫描包结构 修改默认配置 读取application.properties文件 按需加载原则 容器功能 Configuration Import ​编辑 Conditional ImportResource 配置绑定Configur…

一款AutoXJS现代化美观的日志模块AxpLogger

简介 Axp Logger是一款基于autox.js的现代化日志模块&#xff0c;具备窗口事件穿透、拖拽和缩放功能。 Axp Logger文档 特性现代化的UI设计支持点击穿透模式&#xff08;不影响脚本运行&#xff09;监听音量-键切换模式支持窗口操作模式窗口拖拽移动窗口自由缩放清空日志关闭日…

高精-阶乘和-保姆级教程

提供50的阶乘30414093201713378043612608166064768844377641568960512000000000000&#xff1b; 显然要做这题&#xff0c;int 或者 long long 类型的整型放不下这么长的数据所以我们要使用数组用高精度实现&#xff1b; 然后容易想到这题 肯定要用到高精度乘法和高精度加法&…

外包干了3周,技术退步太明显了。。。。。

先说一下自己的情况&#xff0c;大专生&#xff0c;21年通过校招进入武汉某软件公司&#xff0c;干了差不多3个星期的功能测试&#xff0c;那年国庆&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我才在一个外包企业干了3周的功…

Qt(10.11)

数据表 源代码&#xff1a; #include "widget.h" #include "ui_widget.h" #include<QMessageBox>//消息对话框 #include<QDebug> #include<QSqlRecord> Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui-&g…

十、pico+Unity交互开发教程——射线抓取与更多交互功能

一、回顾与引入 回顾上一篇直接抓取的教程&#xff0c;VR交互一般需要可交互的对象&#xff08;Interactable&#xff09;和发起交互的对象&#xff08;Interactor&#xff09;。直接抓取和射线抓取的可交互对象无区别&#xff0c;可参考上一篇教程设置组件。两者区别在于发起…

【Vercel】Vercel静态部署踩坑

背景 在现代的软件开发中&#xff0c;自动化部署是一个不可或缺的环节。Vercel作为一个流行的前端部署平台&#xff0c;提供了与GitHub的无缝集成&#xff0c;使得开发者能够在每次提交代码后自动触发部署流程。然而&#xff0c;自动化部署过程中可能会遇到一些挑战&#xff0…

性能测试:流量回放工具-GoReplay!结合一款无需CA证书即可抓取HTTPS明文的工具,简直无敌

性能测试&#xff1a;流量回放工具-GoReplay&#xff01;结合一款无需CA证书即可抓取HTTPS明文的工具&#xff0c;简直无敌。 GoReplay 是一个开源网络监控工具&#xff0c;可以将实时 HTTP 流量捕获并重放到测试环境。 应用成熟的过程中&#xff0c;测试所需的工作量往往会成…

学习干货小白女友看完这篇文章后,面试工作和护网蓝队初级竟然秒通过!

小白女友看完这篇文章后&#xff0c;面试工作和护网蓝队初级竟然秒通过&#xff01; 前言&#xff1a;本文中涉及到的相关技术或工具仅限技术研究与讨论&#xff0c;严禁用于非法用途&#xff0c;否则产生的一切后果自行承担&#xff0c;如有侵权请联系。 还在学怎么挖通用漏…

【Linux】<互斥量>解决<抢票问题>——【多线程竞争问题】

前言 大家好吖&#xff0c;欢迎来到 YY 滴Linux系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; YY的《C》专栏YY的《C11》专栏YY的《Lin…

Axure树形菜单展开与折叠

亲爱的小伙伴&#xff0c;在您浏览之前&#xff0c;烦请关注一下&#xff0c;在此深表感谢&#xff01; 课程主题&#xff1a;Axure树形菜单展开与折叠 主要内容&#xff1a;树形菜单制作——层级关系——隐藏与显示——值的变化——多层交互 应用场景&#xff1a;关系树、菜…

老机MicroServer Gen8再玩 OCP万兆光口+IT直通

手上有一台放了很久的GEN8微型服务器&#xff0c;放了很多年&#xff0c;具体什么时候买的我居然已经记不清了 只记得开始装修的时候搬家出去就没用了&#xff0c;结果搬出去有了第1个孩子&#xff0c;孩子小的时候也没时间折腾&#xff0c;等孩子大一点的时候&#xff0c;又有…

MongoDB查询操作

&#x1f337;启动mongo &#x1f388;启动mongo shell &#xff08;1&#xff09;在指定目录下创建mongodb文件夹、其子文件夹data、log以及文件mongodb.log cd /home/ubuntu mkdir -p mongodb/data mkdir -p mongodb/log touch mongodb/log/mongodb.log(2)先执行mongodb命…

《计算机视觉》—— 疲劳检测

文章目录 一、疲劳检测实现的思想二、代码实现 一、疲劳检测实现的思想 了解以下几篇文章有助于了解疲劳检测的方法 基于dlib库的人脸检测 https://blog.csdn.net/weixin_73504499/article/details/142977202?spm1001.2014.3001.5501 基于dlib库的人脸关键点定位 https://blo…

基于开源Jetlinks物联网平台协议包-MQTT自定义主题数据的自动回复

目录 1.根据需要自动回复某些主题 2.调用doReply方法进行自动回复 1.根据需要自动回复某些主题 根据主题判断&#xff0c;哪些主题是需要自动回复的&#xff0c;比如设备登录&#xff0c;需要自动回复。 2.调用doReply方法进行自动回复&#xff08;代码不一定全部正确&#xf…

第 5 章:vuex

1. 理解 vuex vuex 是什么&#xff1a; 概念&#xff1a;专门在 Vue 中实现集中式状态&#xff08;数据&#xff09;管理的一个 Vue 插件&#xff0c;对 vue 应用中多个组件的共享状态进行集中式的管理&#xff08;读/写&#xff09;&#xff0c;也是一种组件间通信的方式&am…

安乃达:用CRM构建从销售到管理到售后的全链路数字化运营平台

安乃达驱动技术(上海)股份有限公司((简称&#xff1a;“安乃达”,股票代码为&#xff1a;“603350”))自2011年以来&#xff0c;公司通过多年的研发与积累现有直驱轮毂电机、减速轮毂电机和中置电机三大系列产品&#xff0c;并具备与电机相匹配的控制器、传感器、仪表等电驱动成…

springboot旧物置换网站

作者&#xff1a;计算机学长阿伟 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、ElementUI等&#xff0c;“文末源码”。 系统展示 【2024最新】基于JavaSpringBootVueMySQL的&#xff0c;前后端分离。 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;…

ThinkPHP 3.2 + Nginx 页面404问题

学习公司Callout项目时&#xff0c;发现公司项目所使用的TP版本是3.2&#xff0c;所以才可以使用例如&#xff0c;C,M,A等方法 因此我用phpEnv搭建了一个项目&#xff0c;域名为thinkphp&#xff0c;所选根目录如下 我打开网页&#xff0c;访问 thinkphp/ 和 thinkphp/index.p…