当前位置: 首页 > news >正文

数据结构链表2(常考习题1)(C语言)

移除链表元素:

. - 力扣(LeetCode)

题目:

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

解题思路:

情况1:

情况2:

情况3:

我们以第一种情况写代码:

ListNode* removeElements(ListNode* head, int val)
{ListNode* cur = head;ListNode* slow = head;while (cur){if (cur->val == val){ListNode* tmp = cur->next;free(cur);cur = tmp;slow->next = cur;}else{slow = cur;cur = cur->next;}}
}

以第二、三种特殊情况改代码:

如果第一次就要删除头:

struct ListNode* removeElements(struct ListNode* head, int val)
{struct ListNode* cur = head;struct ListNode* tmp = NULL;struct ListNode* slow = head;while (cur){if (cur->val == val){tmp = cur->next;if(head->val == val){free(cur);cur = tmp;head = cur;slow = head;}else{free(cur);cur = tmp;slow->next = cur;}}else{slow = cur;cur = cur->next;}}return head;
}

反转链表:

. - 力扣(LeetCode)

题目:


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

解题思路:

考虑特殊:

只有一个元素:

同样适用!! 

        双指针解题,一个前驱指针,一个指向head的指针,还有一个临时变量next为了记录head的next的值。

具体代码如下:

ListNode* reverseList(ListNode* head)
{ListNode* cur = head;ListNode* slow = NULL;ListNode* next = NULL;while (cur){next = cur->next;cur->next = slow;slow = cur;cur = next;}
}

链表的中间节点:

. - 力扣(LeetCode)

题目:

        给你单链表的头结点 head ,请你找出并返回链表的中间结点。

        如果有两个中间结点,则返回第二个中间结点。

解题思路:

        利用快慢指针,有四种情况,如图所示:

第一种,链表个数为偶数时:

第二种,链表个数为奇数时:

第三种,链表个数为1个时:

第四种,链表个数为2个时:

综上:

得出结论:
1、当链表个数大于2时,且为偶数时:

当快指针的next走到NULL时,慢指针所在的地方就是中间结点的地方。

2、当链表个数大于2时,且为奇数时:

当快指针走到NULL时,慢指针所在的地方就是中间节点的地方。

3、当链表个数等于1时:

快指针和慢指针不需要走。

4、当链表个数为2时:

和情况一是一样的。

综上:

也就是快指针分两种情况:

第一种就是快指针自身到达NULL时,第二种就是快指针的next到达NULL时。

不论是那种情况,最终都返回慢指针!!

代码如下:

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

合并两个有序链表:

. - 力扣(LeetCode)

题目:

将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 

解题思路:

        两个链表,每个链表都有一个可以移动的指针,接着让一个指针移动,每移一步让两个指针指向的值做对比,小的移下来,然后让新链表的指针和刚刚移动过的俩把表指针往后走一步。

        直到其中一个链表的指针指向空之后,将另一个链表的剩下部分整体移过去!

画图很重要!!!

特殊考虑:

        如果其中一个链表为空,可以指直接返回另一个链表的地址!

代码如下:

画图很重要!!!!!!

struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2)
{struct ListNode* cur1 = list1;struct ListNode* cur2 = list2;struct ListNode* newhead = NULL;struct ListNode* tmp = NULL;if (cur1 == NULL){return cur2;}else if(cur2 == NULL){return cur1;}while (cur1 && cur2){if (cur1->val > cur2->val){if (newhead == NULL){newhead = tmp = cur2;}else{tmp->next = cur2;tmp = tmp->next;}cur2 = cur2->next;}else{if (newhead == NULL){newhead = tmp = cur1;}else{tmp->next = cur1;tmp = tmp->next;}cur1 = cur1->next;}}if (cur1 == NULL){tmp->next = cur2;}else{tmp->next = cur1;}return newhead;   
}

链表分割:

链表分割_牛客题霸_牛客网

题目:

        现有一链表的头指针 ListNode* pHead,给一定值x,编写一段代码将所有小于x的结点排在其余结点之前,且不能改变原来的数据顺序,返回重新排列后的链表的头指针。

解题思路:

        将比x大的和比x小的首先区分开,最后再将其合并在一起!!

注意:最后比x大的后面需要手动在末尾添加NULL指针!


考虑特殊:

        如果链表中没有比x大的数,或者没有比x小的数,此时直接返回原链表的地址!!

代码如下:
 

ListNode* partition(ListNode* pHead, int x) 
{ListNode* cur = pHead;ListNode* newhead1 = NULL;ListNode* tmp1 = NULL;ListNode* newhead2 = NULL;ListNode* tmp2 = NULL;while (cur){if (cur->val > x){if (newhead1 == NULL){newhead1 = tmp1 = cur;}else{tmp1->next = cur;tmp1 = tmp1->next;}}else{if (newhead2 == NULL){newhead2 = tmp2 = cur;}else{tmp2->next = cur;tmp2 = tmp2->next;}}cur = cur->next;}if (!(newhead1 && newhead2)){return pHead;}tmp1->next = NULL;tmp2->next = newhead1;return newhead2;
}

链表的回文结构:

链表的回文结构_牛客题霸_牛客网

题目:

对于一个链表,请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法,判断其是否为回文结构。

给定一个链表的头指针A,请返回一个bool值,代表其是否为回文结构。保证链表长度小于等于900。

测试样例:

1->2->2->1
返回:true

解题思路:

        文字叙述:


        只需要将该链表进行反转后,然后两个链表进行遍历,如果中途有不一样的值就输出fasle

如果遍历结束后,两个指针都指向NULL,返回true,就可以说明该链表是回文结构。

具体代码:
        

     ListNode* Reverse(ListNode*head)//链表反转代码
{ListNode* cur = head;ListNode* slow = NULL;while (cur){ListNode* tmp = cur->next;cur->next = slow;slow = cur;cur = tmp;}return slow;
}bool chkPalindrome(ListNode* pHead) //判断回文代码{ListNode* cur = pHead;ListNode* newhead = NULL;newhead = Reverse(cur);while (cur&&newhead){if(cur->val != newhead->val){return false;}cur = cur->next;newhead = newhead->next;}return true;// write code here}

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

相关文章:

数据结构链表2(常考习题1)(C语言)

移除链表元素: . - 力扣(LeetCode) 题目: 给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val val 的节点,并返回 新的头节点 。 解题思路: 情况1: 情…...

Rust的运行时多态

Rust的运行时多态 Rust的静态多态即编译时多态,通过**泛型特征约束(Generic Type Trait Constrait)**来实现; 那么动态多态(运行时多态)呢?答案是特征对象(Trait Object&#xff…...

sqllabs通关

sqllabs5:(报错注入) ?id1 回显You are in........... ?id2-1 回显You are in........... ?id1 回显 1 LIMIT 0,1 判断是字符型,闭合。?id1order by 3-- //页面显示正常我们试了4行得出是报错注入 我们先爆库名 http://127.0.0.1/sqli-labs-master/L…...

RTSP系列四:RTSP Server/Client实战项目

RTSP系列: RTSP系列一:RTSP协议介绍-CSDN博客 RTSP系列二:RTSP协议鉴权-CSDN博客 RTSP系列三:RTP协议介绍-CSDN博客 RTSP系列四:RTSP Server/Client实战项目-CSDN博客 目录 一、RTSP Server实战项目 1、准备 2、…...

sqli-labs-php7-master第11-16关

猜注入点 先来猜数字型 单引号字符型: 发现注入点找到了 猜测数据库有多少个字段: 1’ order by 4 # 密码随便输的。 这里没有使用--注释,因为没作用,可能是过滤掉了 继续猜。刚才没猜对 1 order by 2 # 没报错,猜…...

c++初阶 string的底层实现

string 基础函数成员成员变量构造函数析构函数&#xff1a;拷贝构造赋值构造 遍历下标访问迭代器 增删插开辟空间push_backappendinserterase 功能函数swapfindc_strsubstrclear 其他函数比较函数流提取<<流插入>>getline 完整版 声明&#xff1a;非纯手搓&#xf…...

微信小程序实现上传照片功能

案例&#xff1a; html: <view class"zhengjianCont fontSize30" style"margin-bottom: 40rpx;"><view class"kuai"><image binderror"imageOnloadError" bind:tap"upladPhoto" data-params"business…...

lombok安装成功但是找不到方法

2024.1.1版本的IDE的插件安装了默认的lombok&#xff08;如图1&#xff09;&#xff0c;pom文件中也引入了lombok的依赖&#xff0c;在实体类写了Data的注解&#xff0c;当调用实体类的get和set方法运行时&#xff0c;报错找不到相应的方法&#xff0c;但是在调用get、set方法的…...

单细胞Seurat的umi矩阵-与feature、counts(用于质控)

目录 关于umi矩阵学习 用umi计算feature、counts值 ①meta数据查看 ②Count和Feature计算(生成Seurat时自动计算) 1)提取UMI矩阵 2)计算 其他指标 评估质量指标(重点) 1)UMI计数 2)基因计数 3)UMIs vs. genes detected 4)线粒体计数比率 5)综合过滤 过…...

安防视频监控EasyCVR视频汇聚平台设备发送了GPS位置,但是订阅轨迹为空是什么原因?

安防视频监控EasyCVR视频汇聚平台兼容性强、支持灵活拓展&#xff0c;平台可提供视频远程监控、录像、存储与回放、视频转码、视频快照、告警、云台控制、语音对讲、GIS地图、轨迹跟踪、平台级联等视频能力。 用户描述&#xff0c;设备在电子地图中可以查看到定位信息&#xff…...

在 VueJS 中使用事件委托处理点击事件(事件委托,vue事件委托,什么是事件委托,什么是vue的事件委托)

前言 在开发 Vue 项目时&#xff0c;我们经常需要处理大量的点击事件。为每个可点击的元素单独添加事件监听器不仅会增加代码的复杂度&#xff0c;还会降低性能。事件委托是一种有效的优化方式&#xff0c;它可以显著减少事件监听器的数量&#xff0c;提高代码的可维护性和执行…...

密码学简史:时间密语

​ 注&#xff1a;机翻&#xff0c;未校。 A brief history of cryptography: Sending secret messages throughout time Stemming from the Greek words for “hidden writing,” cryptography is the practice of encrypting transmitted information so that it can only b…...

【Java数据结构】---初始数据结构

乐观学习&#xff0c;乐观生活&#xff0c;才能不断前进啊&#xff01;&#xff01;&#xff01; 我的主页&#xff1a;optimistic_chen 我的专栏&#xff1a;c语言 &#xff0c;Java 欢迎大家访问~ 创作不易&#xff0c;大佬们点赞鼓励下吧~ 前言 从今天开始我们就要学习Java…...

MySQL--主从复制

前言&#xff1a;本博客仅作记录学习使用&#xff0c;部分图片出自网络&#xff0c;如有侵犯您的权益&#xff0c;请联系删除 一、什么是主从复制 1、定义 主从复制&#xff0c;是用来建立一个和主数据库完全一样的数据库环境&#xff0c;称为从数据库&#xff1b;主数据库一…...

Linux RT调度器之负载均衡

RT调度类的调度策略是&#xff1a;保证TopN&#xff08;N为系统cpu个数&#xff09;优先级的任务可以优先获得cpu资源。除了在任务选核时通过基于cpu优先级的选核策略保证这一点外&#xff0c;还有其它流程&#xff0c;我们姑且将这部分流程称作RT调度器的负载均衡&#xff08;…...

pwn学习笔记(8)--初识Pwn沙箱

初识Pwn沙箱 ​ 沙箱机制&#xff0c;英文sandbox&#xff0c;是计算机领域的虚拟技术&#xff0c;常见于安全方向。一般说来&#xff0c;我们会将不受信任的软件放在沙箱中运行&#xff0c;一旦该软件有恶意行为&#xff0c;则禁止该程序的进一步运行&#xff0c;不会对真实系…...

Day18_2--Vue.js Ajax(使用 Axios)基础入门学习

Vue.js 中的 Ajax 请求&#xff08;使用 Axios&#xff09; 什么是 Axios&#xff1f; Axios 是一个基于 Promise 的 HTTP 客户端&#xff0c;可以用于浏览器和 Node.js 环境中。它是现代化的 Ajax 库&#xff0c;用来替代传统的 XMLHttpRequest。 为什么选择 Axios&#xf…...

windows11远程桌面如何打开

随着远程办公的普及&#xff0c;选择合适的远程桌面工具变得尤为重要。在Windows 11上&#xff0c;用户可以利用系统自带的远程桌面功能&#xff0c;或选择更专业的第三方解决方案&#xff0c;如Splashtop。本文将详细介绍如何在Windows 11上启用远程桌面&#xff0c;并对比Win…...

qt代码显示,包含文本颜色设置等

QScintilla 安装示例代码参考链接 安装 最近发现了一个有趣的库&#xff0c;qt的插件库&#xff0c;之前一直以为显示代码时是重写QTextEdit来实现的&#xff0c;结果qt有现成的一个库来显示这些东西&#xff0c;在此记录一下 # 安装 QScintilla pip install QScintilla示例代码…...

抽象代数精解【6】

文章目录 简单密码算法模运算数学定义置换移位代换仿射 参考文献 简单密码算法 模运算数学定义 模m剩余类集 Z m Z_m Zm​ 设∀a,b∈Z&#xff08;整数&#xff09;&#xff0c;m为正整数 m|b-a &#xff0c;称a R b R满足反身性、对称性、传递性 1、R为同余关系&#xff0c;…...

30 分钟搞定答辩 PPT!Paperxie AI 生成器:拯救论文人的「熬夜克星」

paperxie-免费查重复率aigc检测/开题报告/毕业论文/智能排版/文献综述/AIPPThttps://www.paperxie.cn/ppt/createhttps://www.paperxie.cn/ppt/create 一、答辩 PPT 惨案现场&#xff1a;你是不是也在为这四件事崩溃&#xff1f; 论文查重通过的那一刻&#xff0c;你以为终于能…...

【AI知识点】交叉注意力机制:连接不同世界的“信息桥梁”

1. 从"信息桥梁"理解交叉注意力机制 想象你正在同时阅读一本英文书和它的中文翻译版。当你遇到一个不太理解的英文句子时&#xff0c;会自然地在中文版本中寻找对应的段落来帮助理解——这个过程就像交叉注意力机制在神经网络中的工作方式。它就像是架设在两个不同世…...

无噪音RS1 ROSAHL 电解式除湿器 3D 打印耗材盒/户外摄像头/激光器精准除湿设备

RS1 是 ROSAHL&#xff08;日本 Ryosai Technica 生产&#xff09;推出的一款超紧凑型电解式除湿器&#xff0c;采用全球领先的固体聚合物电解质&#xff08;SPE&#xff09;膜技术&#xff0c;通过电化学原理主动将密闭空间内的水分子分解并以气态形式排出。它具备无噪音、无振…...

FORK客户端与GitHub高效协作指南

1. 为什么选择FORK客户端与GitHub协作 作为一个常年混迹在代码仓库的老司机&#xff0c;我试过几乎所有主流的Git图形化工具。FORK客户端给我的第一印象就是——清爽。没有复杂的界面&#xff0c;没有多余的功能&#xff0c;就像它的名字一样&#xff0c;专注做好代码分支管理…...

SPIRAN ART SUMMONER异常处理:常见错误解决方案

SPIRAN ART SUMMONER异常处理&#xff1a;常见错误解决方案 1. 前言 遇到SPIRAN ART SUMMONER运行报错时&#xff0c;别急着放弃。作为一款强大的AI艺术生成工具&#xff0c;它在使用过程中确实会遇到一些典型问题&#xff0c;但大多数都有明确的解决方法。本文汇总了用户反馈…...

Pixel Epic效果展示:支持Markdown+LaTeX混合输出的学术论文初稿生成案例

Pixel Epic效果展示&#xff1a;支持MarkdownLaTeX混合输出的学术论文初稿生成案例 1. 像素史诗&#xff1a;科研写作的新范式 在传统学术写作工具普遍沉闷单调的背景下&#xff0c;Pixel Epic带来了一场视觉与功能双重革新的科研体验。这款基于AgentCPM-Report大模型的智能终…...

从手机端到边缘设备:聊聊轻量化模型设计中FLOPs、MACs和Params的权衡艺术

从手机端到边缘设备&#xff1a;轻量化模型设计中FLOPs、MACs和Params的权衡艺术 当我们在智能手机上使用人脸解锁功能&#xff0c;或是通过智能音箱与AI助手对话时&#xff0c;背后运行的往往是经过精心设计的轻量化神经网络模型。这些模型需要在有限的算力和内存资源下&#…...

Isaac Sim 4.1.0 国内网络环境下的三种下载与安装提速方案(含离线包处理)

Isaac Sim 4.1.0 国内网络环境下的高效安装指南 对于国内开发者而言&#xff0c;安装NVIDIA Isaac Sim往往面临下载速度缓慢、连接不稳定等问题。本文将提供三种经过验证的解决方案&#xff0c;帮助您快速完成安装。 1. 直链下载加速方案 通过分析Omniverse Launcher的日志文件…...

AD20 原理图与PCB的协同设计:从单向更新到双向同步的进阶指南

1. AD20协同设计的基础概念 刚接触AD20时&#xff0c;最让我头疼的就是原理图和PCB之间的同步问题。记得第一次做多板卡项目&#xff0c;光是处理不同原理图之间的元件冲突就折腾了一整天。AD20的协同设计功能远比我们想象的强大&#xff0c;但要用好它&#xff0c;得先理解几个…...

推理神器Phi-4-mini-reasoning实测:解方程、逻辑题一键生成答案

推理神器Phi-4-mini-reasoning实测&#xff1a;解方程、逻辑题一键生成答案 1. 模型介绍与核心能力 Phi-4-mini-reasoning是一款专注于逻辑推理和数学计算的轻量级AI模型。与通用聊天模型不同&#xff0c;它被专门设计用于处理需要分步推理的任务&#xff0c;能够将复杂的解题…...