单链表经典算法

news2024/11/27 22:20:11

移除链表元素

给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。
在这里插入图片描述
思路:(1)创建三个结构体指针,分别代表一条新链表的头newhead,一条新链表的尾newtail,还有一个用于循环旧链表的pcur
(2)循环旧链表,当pcurval不等于函数参数中的val时:1.当新链表为空时,将新链表的newheadnewtail赋值为pcur 2.当新链表不为空时,newtailnext指向pcurnewtail赋值为newtialnext
(3)运行完一个结点pcur赋值为pcurnext
(4)当运行结束时,代表旧链表运行完毕,当最后一个结点等于val时,newtail的值不会是空,而是旧链表最后一个结点的值,因此我们需要进行判断,当newtail不为空时,需要将newtail置空,最后返回newhead即可

struct ListNode* removeElements(struct ListNode* head, int val)
{
    struct ListNode* newhead=NULL;
    struct ListNode* newtail=NULL;
    struct ListNode* pcur=head;
    while(pcur)
    {
        if(pcur->val != val)
        {
            if(newhead == NULL)
            {
                newhead=newtail=pcur;
            }
            else
            {
                newtail->next=pcur;
                newtail=newtail->next;
            }
        }
        pcur=pcur->next;
    }
    if(newtail)
    {
        newtail->next=NULL;
    }
    return newhead;
}

在这里插入图片描述

反转链表

给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。
在这里插入图片描述
思路:(1)若链表为空,则直接返回空
(2)若不为空,创建三个结构体指针分别为n1,n2,n3,将n1赋值为NULLn2赋值为headn3赋值为head->next
(3)以n2为循环条件进行遍历,每次运行都将n2next赋值为n1n1赋值为n2n2赋值为n3,若n3不为空则n3赋值为n3next(下图为第一次和第二次循环图)
(4)又因为n2n3最后的位置都为NULL,所以最后返回n1即可。
在这里插入图片描述

struct ListNode* reverseList(struct ListNode* head) 
{
    if(head==NULL)
    {
        return NULL;
    }
    struct ListNode* n1=NULL;
    struct ListNode* n2=head;
    struct ListNode* n3=head->next;
    while(n2)
    {
        n2->next=n1;
        n1=n2;
        n2=n3;
        if(n3)
        {
            n3=n3->next;
        }
    }
    return n1;
}

在这里插入图片描述

合并两个有序链表

将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
在这里插入图片描述

思路:(1)判断传入的参数list1、list2是否为空,为空则返回另一个
(2)创建四个结构体指针,newhead代表新链表的头,newtail代表新链表的尾,pcur1pcur2分别用来遍历list1list2
(3)若pcur1pcur2都不为空则进入循环,当pcur1val大于pcur2val,判断newhead是否为空,为空则将newheadnewtail赋值为pcur1,不为空则进行新链表结点的插入,即将newtailnext赋值为pcur1newtail赋值为newtailnextpcur1小于等于pcur2时同理,只需将pcur1改为pcur2即可
(4)当循环结束,判断pcur1pcur2是否为空,某个不为空时,将newtailnext赋值为不为空的pcur,最后返回newhead即可

  • 不带头单向不循环链表
//不带头单向不循环链表
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2)
{
    if(list1 == NULL)
    {
        return list2;
    }
    if(list2 == NULL)
    {
        return list1;
    }
    struct ListNode* newhead=NULL;
    struct ListNode* newtail=NULL;
    struct ListNode* pcur1=list1;
    struct ListNode* pcur2=list2;
    while(pcur1 && pcur2)
    {
        if((pcur1->val) < (pcur2->val))
        {
            if(newhead == NULL)
            {
                newhead=newtail=pcur1;
            }
            else
            {
                newtail->next=pcur1;
                newtail=newtail->next;
            }
            pcur1=pcur1->next;
        }
        else
        {
            if(newhead == NULL)
            {
                newhead=newtail=pcur2;
            }
            else
            {
                newtail->next=pcur2;
                newtail=newtail->next;
            }
            pcur2=pcur2->next;
        }
    }
    if(pcur1 != NULL)
    {
        newtail->next=pcur1;
    }    
    if(pcur2 != NULL)
    {
        newtail->next=pcur2;
    }
    return newhead;
}
  • 带头单向不循环链表
    思路:(1)newheadnewtail的初始值不再是NULL,而是一个没有val值的结点,相当于是一个哨兵位。因此就不再需要判断newhead是否为空。
    (2)最后需要将mallocnewhead指针释放,需要创捷一个新结构体指针rehead赋值为newheadnext,便可进行newhead的释放,最后返回rehead即可
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2)
{
    if(list1 == NULL)
    {
        return list2;
    }
    if(list2 == NULL)
    {
        return list1;
    }
    struct ListNode* newhead=(struct ListNode*)malloc(sizeof(struct ListNode));
    struct ListNode* newtail=newhead;
    struct ListNode* pcur1=list1;
    struct ListNode* pcur2=list2;
    while(pcur1 && pcur2)
    {
        if((pcur1->val) < (pcur2->val))
        {
            newtail->next=pcur1;
            newtail=newtail->next;
            pcur1=pcur1->next;
        }
        else
        {
            newtail->next=pcur2;
            newtail=newtail->next;
            pcur2=pcur2->next;
        }
    }
    if(pcur1 != NULL)
    {
        newtail->next=pcur1;
    }    
    if(pcur2 != NULL)
    {
        newtail->next=pcur2;
    }
    struct ListNode* rehead=newhead->next;
    free(newhead);
    newhead=NULL;
    return rehead;
}

在这里插入图片描述

链表的中间结点

给你单链表的头结点 head ,请你找出并返回链表的中间结点。
如果有两个中间结点,则返回第二个中间结点。
在这里插入图片描述
思路:(1)运用快慢指针,创建两个结构体指针,分别为slowfastslow每次走一个结点,fast每次走两个结点(如下图)
(2)返回slow指针即可在这里插入图片描述

struct ListNode* middleNode(struct ListNode* head) 
{
    struct ListNode* fast=head;
    struct ListNode* slow=head;
    while(fast && fast->next)
    {
        slow=slow->next;
        fast=fast->next->next;
    }
    return slow;
}

在这里插入图片描述

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

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

相关文章

Day20力扣打卡

打卡记录 数组中两个数的最大异或值&#xff08;位运算&#xff09; 链接 二进制位上从高位向低位进行模拟&#xff0c;看数组中是否有满足此情况的数字。具体题解 class Solution { public:int findMaximumXOR(vector<int>& nums) {int mx *max_element(nums.be…

c语言经典算法—二分查找,冒泡,选择,插入,归并,快排,堆排

一、二分查找 1、前提条件&#xff1a;数据有序&#xff0c;随机访问&#xff1b; 2、实现&#xff1a;递归实现&#xff0c;非递归实现 3、注意事项&#xff1a; 循环退出条件:low <high,low high.说明还有一个元素&#xff0c;该元素还要与key进行比较 mid的取值&#xf…

半导体工厂将应用哪些制造创新技术?

半导体工厂是高科技产业的结晶&#xff0c;汇聚了世界上最新的技术。 在半导体的原料硅晶片上绘制设计图纸&#xff0c;不产生误差&#xff0c;准确切割并包装&#xff0c;然后用芯片生产出我们使用的电脑、智能手机、手表等各种电子产品。绝大多数半导体厂都采用一贯的工艺&a…

vr煤矿掘进机事故模拟救援减少实际工作中的失误-深圳华锐视点

在矿业行业中&#xff0c;VR掘进机操作模拟仿真训练正逐渐成为一种高效、安全、便捷的培训方式。VR掘进机操作模拟仿真训练根据现实中掘进机操作情景进行流程模拟还原&#xff0c;用户可以在沉浸模式下进行体验掘进机发生过程&#xff0c;加上模拟训练和实操考核&#xff0c;进…

MySQL数据脱敏(Data masking plugin functions)

对于企业而言&#xff0c;数据脱敏可以在数据共享或测试时用于保护敏感数据&#xff08;如信用卡&#xff0c;社保卡&#xff0c;地址等&#xff09;。通过对敏感数据进行脱敏处理&#xff0c;组织可以最大限度地降低数据泄露和未经授权访问的风险&#xff0c;同时仍能够使用真…

【WSL/WSL 2-Redis】解决Windows无法安装WSL Ubuntu子系统与Redis安装

前言 在现代计算环境中&#xff0c;开发人员和技术爱好者通常需要在不同的操作系统之间切换&#xff0c;以便利用各种工具和应用程序。在这方面&#xff0c;Windows用户可能发现WSL&#xff08;Windows Subsystem for Linux&#xff09;是一个强大的工具&#xff0c;它允许他们…

NocoDB任意文件读取漏洞复现

简介 NocoDB是一个开源 Airtable 替代品&#xff0c;可以将 MySql、PostgreSql、Sql Server、Sqlite 和 MariaDb 等转换为智能电子表格。 (CVE-2023-35843) NocoDB 0.106.0版本及之前版本存在安全漏洞。攻击者利用该漏洞可以访问服务器上的任意文件。 漏洞复现 FOFA语法&…

dji mini4pro 图片拷贝到电脑速度

环境 win电脑 amd3600 m.2固态硬盘 dp快充数据线 直接主机使用dp线连接无人机 9成是raw格式图片 一小部分是视频和全景图 TF卡信息: 闪迪 128GB 129元 闪迪 128GB TF(MicroSD) 存储卡U3 C10 V30 A2 4K 至尊超极速移动版 "TF卡至尊超极速" 理论读取200MB/s …

Android可绘制资源概览(背景、图形等)

关于作者&#xff1a;CSDN内容合伙人、技术专家&#xff0c; 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 &#xff0c;擅长java后端、移动开发、商业变现、人工智能等&#xff0c;希望大家多多支持。 目录 一、导读二、概览三、drawable 分类3.1 Bitmap fileXML …

LiveNVR监控流媒体Onvif/RTSP常见问题-分配展示接入的通道没有云台控制按钮云台控制灰色无法操作怎么办?

LiveNVR常见问题-接入的通道没有云台控制按钮云台控制灰色无法操作怎么办&#xff1f; 1、云台控制灰色2、怎样才可以云台控制3、RTSP/HLS/FLV/RTMP拉流Onvif流媒体服务 1、云台控制灰色 LiveNVR在分屏页面播放的时候&#xff0c;发现有边的云台控制不可用。而我们需要云台控制…

【排序算法】 快速排序(快排)!超详细看这一篇就够了”保姆级教学“

&#x1f3a5; 屿小夏 &#xff1a; 个人主页 &#x1f525;个人专栏 &#xff1a; 算法—排序篇 &#x1f304; 莫道桑榆晚&#xff0c;为霞尚满天&#xff01; 文章目录 &#x1f4d1;前言&#x1f324;️快速排序的概念☁️快速排序的由来☁️快速排序的思想☁️快速排序的实…

在Python中添加Selenium Web Driver等待

本文将介绍在Python中在Selenium Web驱动程序中添加等待的示例。 Python Selenium Web 驱动程序等待 大多数 Web 应用程序都使用 AJAX 技术。 因此&#xff0c;网页上存在的不同元素需要不同的时间间隔才能完全上传&#xff0c;因为硒在网页上存在之前无法找到任何文本。 我们…

康耐视深度学习ViDi-Workspace菜单介绍与Workspace侧拉菜单

Workspace菜单介绍 New ------- 新建一个程序&#xff0c;点击后会呼出如下窗口&#xff0c;输入需要建立的程序的名字。然后点击OK按钮&#xff0c;就会建立一个新的程序。 Save --------- 保存当前的程序 Close -------- 关闭当前的程序 Delete ------ 删除当前的程序 Save …

数字媒体技术基础之:ICC 配置文件

ICC 配置文件&#xff08;也称为 ICC 色彩配置文件或 ICC 色彩描述文件&#xff09;是由国际色彩联盟&#xff08;International Color Consortium, ICC&#xff09;制定的一种标准文件格式&#xff0c;用于在不同的设备和软件之间保持颜色的一致性。 ICC 配置文件包含有关设备…

“凸函数”是什么?

凸函数&#xff08;英文&#xff1a;Convex function&#xff09;是指函数图形上&#xff0c;任意两点连成的线段&#xff0c;皆位于图形的上方&#xff0c;如单变数的二次函数和指数函数。二阶可导的一元函数为凸&#xff0c;当且仅当其定义域为凸集&#xff0c;且函数的二阶导…

1-Docker虚拟化平台技术概述及简介

1.虚拟化技术概述及简介 通俗的说,虚拟化就是把物理资源转变为逻辑上可以管理的资源,以打破物理结构间的壁垒,计算元件运行在虚拟的基础上而不是真实的基础上,可以扩大硬件的容量,简化软件的重新配置过程。允许一个平台同时运行多个操作系统,并且应用程序都可以在相互独…

JavaScript设计模式之责任链模式

适用场景&#xff1a;一个完整的流程&#xff0c;中间分成多个环节&#xff0c;各个环节之间存在一定的顺序关系&#xff0c;同时中间的环节的个数不一定&#xff0c;可能添加环节&#xff0c;也可能减少环节&#xff0c;只要保证顺序关系就可以。 如下图&#xff1a; ES5写法…

C++基础——对于C语言缺点的补充(1)

目录 1.命名空间&#xff1a; 1.1 为什么要引入命名空间&#xff1a; 1.2 命名空间的作用&#xff1a; 1.3 如何访问命名空间内的变量&#xff1a; 1.4 命名空间的嵌套&#xff1a; 1.5 不同文件下同名命名空间的合并&#xff1a; 1.6 命名空间的展开&#xff1a; 2. C…

【计算机网络笔记】TCP连接管理(图解三次握手和四次挥手)

系列文章目录 什么是计算机网络&#xff1f; 什么是网络协议&#xff1f; 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能&#xff08;1&#xff09;——速率、带宽、延迟 计算机网络性能&#xff08;2&#xff09;…

SpringBoot开发组件总结

大家好&#xff0c;今天学习了SpringBoot中间件开发&#xff0c;在学习后总结记录下。 在开发的过程中&#xff0c;把一些公共的非业务的代码提炼出来&#xff0c;做成一个公用的组件&#xff0c;减少开发成本和风险&#xff0c;今天学习的是一个白名单控制组件&#xff0c;记…