数据结构:链表算法题

news2024/11/16 18:42:06

目录

  • 题1.删除链表中的某个元素val
    • 题目表述:
    • 思路1:在源链表中进行删除更改
    • 思路2:创建一个新链表
  • 题2:反转一个链表
    • 问题描述:
    • 思路1:在源链表内部进行操作
    • 思路2:创建一个新链表
  • 题3:寻找链表中间位置
    • 题目描述:
    • 思路1:
    • 思路2:快慢指针

题1.删除链表中的某个元素val

题目表述:

在这里插入图片描述

思路1:在源链表中进行删除更改

1.利用循环遍历链表

2.在遇到要删除的元素时,将该节点后的节点地址保存到要删除的节点前的节点内部。

3.保证新链表的末尾地址内指向的下一个节点的地址为空指针。

3.返回源链表的首节点地址。
这个比较简单,就不再演示了。

思路2:创建一个新链表

需要的数据:新链表的首地址以及𮧵地址,源文件的首节点地址

1.利用循环遍历整个链表

2.在遍历链表,链表的地址逐一传给新链表,遇到要删除的数据,不传给新链表,将源链表地址向后移位一个节点

3.保证新链表的末尾地址内指向的下一个节点的地址为空指针。

4.返回新链表的首节点地址。
代码实现:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
 typedef struct ListNode ListNode;
struct ListNode* removeElements(struct ListNode* head, int val) {
    ListNode* newhead=NULL,*newtail=NULL;
    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;
}

题2:反转一个链表

问题描述:

在这里插入图片描述
案例:
在这里插入图片描述

思路1:在源链表内部进行操作

1.创建三个变量ps1,ps2,ps3
2.将ps1设为NULL,ps1指向第一个节点位置,ps2指向ps1下一个节点:ps2=ps1->next
具体如图:
在这里插入图片描述

4.返回链表的头结点地址。
代码实现:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
 typedef struct ListNode ListNode;
struct ListNode* reverseList(struct ListNode* head) {
    if(head==NULL)
    {
        return head;
    }
    ListNode* ps1,*ps2,*ps3;
    ps1=NULL;ps2=head;ps3=ps2->next;
    while(ps2)
    {
        ps2->next=ps1;
        ps1=ps2;
        ps2=ps3;
        if(ps2)
            ps3=ps2->next;
    }
    return ps1;
}

这个思路不太好描述,可能描述出来不太好理解,但是直到这个思路的会发现它其实跟创建一个新链表,然后让节点一个一个头插到新链表里面的思路相似,所以就引出了我们的思路2.

思路2:创建一个新链表

数据需求:创建两个指针,一个指向头结点,一个指向尾节点。

1.利用循环遍历数组

2.将每个节点头插到新链表

3.将新链表的尾节点内指针置为空指针

4.返回新链表的头结点地址
代码实现:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
 typedef struct ListNode ListNode;
struct ListNode* reverseList(struct ListNode* head) {
    if(head==NULL)
    {
        return head;
    }
    ListNode* ,*newtail;
    newhead=newtail=NULL;
    ListNode* pcur=head;
    while(pcur)
    {
        if(newhead  ==NULL)
        {
            newhead =newtail=pcur;
            pcur=pcur->next;
        }
        else
        {
            ListNode* ps=pcur->next;
            pcur->next=newhead;
            newhead=pcur;
            pcur=ps;
        }
    }
    newtail->next=NULL;
    return newhead;
}

题3:寻找链表中间位置

题目描述:

在这里插入图片描述
示例:
在这里插入图片描述

思路1:

1.遍历一遍链表,统计链表节点个数

2.将链表节点数目除2,找到中间节点的位置

3.第二次遍历链表,找到中间位置的节点并返回该节点的地址。
这个思路很简单,有兴趣的下去可以自行尝试一下。

思路2:快慢指针

1.定义两个指针,同时指向头结点

2.一个指针向后移位一个节点,一个指针向后移位两个节点,以此类推,当快节点走到末尾节点时,第一个节点就刚好停在了中间节点的位置,在这里分两种情况,节点数目为奇数或者偶数:

1.节点数目为奇数:

2.节点数目为偶数:

3.返回慢指针的地址

代码实现:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
 
struct ListNode* middleNode(struct ListNode* head) {
    struct ListNode* ps1,*ps2;
    ps1=ps2=head;
    while(ps2&&ps2->next)
    {
        ps1=ps1->next;
        ps2=ps2->next->next;   
    }
    return ps1;
}

快慢指针理解图示:

在这里插入图片描述
由上图可知,循环结束的条间为ps为空或者ps->next为空,所以他们都不为空时循环继续。
但是循环判断条件前后顺序不可更改。
当ps2为空时,ps2->next就会对空指针解引用,会报错。
---------------------------------------------------------------------------分隔符
有错请在评论区指正,谢谢
本次介绍就结束了,编写不易,看官老爷们赏个三连吧。

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

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

相关文章

1.1.5 计算机网络的性能指标(下)

时延: 指数据从网络的一端传送到另一端所需的时间。有时候也称为延迟或迟延。 总时延发送时延传播时延处理时延排队时延 发送时延: 又名传输时延,节点将数据推向信道所花的时间 数据长度/发送速率 传播时延: 电磁波在信道…

Windows电脑本地安装DrawDB数据库设计工具并一键发布公网远程使用

文章目录 前言1. Windows本地部署DrawDB2. 安装Cpolar内网穿透3. 实现公网访问DrawDB4. 固定DrawDB公网地址 前言 我们在开发项目时很多时候都会使用到数据库,所以选择一个好用的数据库设计工具会让工作效率翻倍。在当今数字化时代,数据库管理是许多企业…

git clone或repo init 时报错:fatal: 协议错误:错误的行长度 xxx

执行repo init或git clone时报错:protocol error: bad line length 或协议错误:错误的行长度 系统版本:Ubuntu20.04 repo version v2.47 repo launcher version 2.45 git version 2.25.1 报错信息 fatal: 协议错误:错误的行长度 948 fatal: 远端意外挂断了 repo: err…

一篇文章让你秒懂MySQL中的各种锁

目录 一、序言二、各种锁详细介绍1、Shared and Exclusive Locks(共享锁和读占锁)2、Intention Locks(意向锁)3、Record Locks(记录锁)4、Gap Locks(间隙锁)5、Next Key Locks (Next Key锁)6、Insert Intention Locks (插入意向锁)7、AUTO-INC Locks (自增锁)8、Predicate Lock…

java 生成.h文件,java调用c语言dll动态链接库流程

** 1、首先创建一个java文件,里面最好不要有中文 ** /*** BelongsPackage: PACKAGE_NAME* Author: wangqian* CreateTime: 2024-09-27 18:42:24* Describe:*/ public class testDll {static {System.loadLibrary("testDll");}public native int add(…

思科安全网络解决方案

《网安面试指南》http://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247484339&idx1&sn356300f169de74e7a778b04bfbbbd0ab&chksmc0e47aeff793f3f9a5f7abcfa57695e8944e52bca2de2c7a3eb1aecb3c1e6b9cb6abe509d51f&scene21#wechat_redirect 《Java代码审…

NVLM多模态 LLM 在图像和语言任务中的表现优于 GPT-4o

论文地址:https://arxiv.org/pdf/2409.11402 背景 传统的多模态 LLM 有两种主要方法:纯解码器架构(如 LLaVA)和基于交叉注意力的架构(如 Flamingo)。混合架构,既提高了训练效率,又增…

基于微信小程序的宿舍报修系统的设计与实现(lw+演示+源码+运行)

摘 要 互联网发展至今,无论是其理论还是技术都已经成熟,而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播,搭配信息管理工具可以很好地为人们提供服务。针对成果信息管理混乱,出错率高,信息安全性差&am…

SSL证书自动申请脚本

文章目录 介绍(直接翻译的)特点 准备设置Powershell脚本权限安装Posh-ACME导入Posh-ACME模块设置Email申请DNS操作权限 生成证书查看证书位置效果 介绍(直接翻译的) PowerShell模块和ACME客户端,用于从具有 ACME 功能…

基于大数据可视化的图书推荐及数据分析系统

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码 精品专栏:Java精选实战项目…

腾讯一面-LRU缓存

为了设计一个满足LRU(最近最少使用)缓存约束的数据结构,我们可以使用哈希表(HashMap)来存储键值对,以便在O(1)时间复杂度内访问任意键。同时,我们还需要一个双向链表(Doubly Linked …

Mac下可以平替paste的软件pastemate,在windows上也能用,还可以实现数据多端同步

Mac平台上非常经典的剪贴板管理工具:「Paste」。作为一款功能完善且易用的工具,「Paste」在实际使用中体现出了许多令人欣赏的特点。但是它是一个收费软件,一年至少要24美元. 现有一平替软件pastemate,功能更加丰富,使用更加方便。 下载地址…

【JAVA报错已解决】 Java.lang.ArrayIndexOutOfBoundsException

🎬 鸽芷咕:个人主页 🔥 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 专栏介绍 在软件开发和日常使用中,BUG是不可避免的。本专栏致力于为广大开发者和技术爱好者提供一个关于BUG解决的经…

基于vue框架的传统文化传播网站设计与实现f7r43(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能:用户,文化类型,传统文化 开题报告内容 基于Vue框架的传统文化传播网站设计与实现开题报告 一、研究背景 在全球化加速的今天,各国文化相互交融,但也面临着传统文化被边缘化的风险。中国拥有五千年文明史&#…

深夜实验室惊现!AI独立撰写未来论文初稿!

在都市的深夜,当大部分人已进入睡眠之际,某个角落仍旧灯火明亮、活力四射——那是我们的人工智能研究所。此处,自动化机器人和精密算法正在进行激烈的竞赛,致力于撰写可能引领未来变革的前沿科研论文。 科研论文的核心在于其创新…

【数据结构】堆(Heap)详解

在深入了解堆这一重要的数据结构之前,不妨先回顾一下我之前的作品 ——“二叉树详解”。 上篇文章👉剖析二叉树(Binary Tree) 二叉树作为一种基础的数据结构,为我们理解堆以及其他更复杂的数据结构奠定了坚实的基础。它…

Python 从入门到实战30(高级文件的操作)

我们的目标是:通过这一套资料学习下来,通过熟练掌握python基础,然后结合经典实例、实践相结合,使我们完全掌握python,并做到独立完成项目开发的能力。 上篇文章我们讨论了操作目录的相关知识。今天我们将学习一下高级文…

distinct导致sql超时

前言 昨天敲着敲着代码,小杨哥跑过来给我说,快看他们大会议室演示报错了,还是一堆错了。完了啊在演示的时候报错!!!接下来我们分析一下是什么原因吧。 问题分析 查看日志: 从日志打印看明显的…

[大语言模型-论文精读] 大语言模型是单样本URL分类器和解释器

[大语言模型-论文精读] 大语言模型是单样本URL分类器和解释器 目录 文章目录 [大语言模型-论文精读] 大语言模型是单样本URL分类器和解释器目录1. 论文信息2. 摘要3. 引言4. 相关工作A. 网络钓鱼URL检测B. 使用LLMs进行单样本分类 C. LLMs作为分类器的可解释性 5. 论文所提框架…

自媒体人打造视频号爆款短视频其实很简单

最近找我做自媒体起号辅导的非常多,当然今天的方法也很适合我们的自媒体短视频运营。 美国心理学家米勒(Miller)被誉为认知心理学奠基人之一,有关短时记忆容量的研究表明:人的短时记忆保持时间在无复述的情况下只有5~20秒,最长也…