数据结构·单链表经典例题
1. 移除链表元素
OJ链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

本题是说给出一个链表的头节点head和一个整数val,如果发现节点中存的数据有val就删掉它,最后返回修改后的链表头节点地址
如果题目中没有明确提及给出的链表是否是带头的,那就默认是不带头的链表,此时题目中再提到头节点就是指链表的第一个节点
思路1:
从第二个节点开始,判断其内含的数据是否是val,然后遍历链表,最后判断头节点中数据是否是val,如果是,再挪移头节点的指向
至于为什么从第二个节点开始扫描是为了不用每次都判断一下头节点要不要移动,先把后面的节点都处理好,最后再确定头节点的指向
但是这个思路还是太复杂了
思路2:
创建一个新链表,把不是val的节点都丢到新链表中去,最后返回新链表的头节点
与其说是创建了一个新链表,不如说是将原链表的链接顺序拿到一个新的地方进行更改
struct ListNode* removeElements(struct ListNode* head, int val)
{//记录新链表的头和尾struct ListNode* newhead = NULL;struct ListNode* newtail = NULL;//pcur用来扫描原链表struct ListNode* pcur = head;while (pcur){//不是val尾插到新链表的尾if (pcur->val != val){//如果新链表为空,那么新加入的节点既是头节点也是尾节点if (newhead == NULL){newhead = pcur;newtail = pcur;}//如果链表不为空,就将新节点放到链表尾,else{newtail->next = pcur;newtail = pcur;}}//pcur指向的节点是不是val都要往下走pcur = pcur->next;}//因为有可能返回的是空链表,所以不能粗暴的去访问newtail->next//要先判断要返回的newtail是否为空,也就是说是否是空链表if (newtail){newtail->next = NULL;}return newhead;
}
2. 链表的中间结点
OJ链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

本题是说,给出一个链表的头节点head,然后找到这个链表的中间节点,如果有两个中间节点,就返回第二个中间节点
思路1:
遍历整个链表,数出一共有几个节点,然后通过除2找到中间节点的"下标",然后通过"下标",再访问出中间节点的地址
很明显,这个方法很麻烦
思路2:快慢指针法
跟前面双指针那节一样,这个快慢指针也不是真正的创造两个指针,而是创造两个具有类似指针功能的变量
思路就是创造一个慢指针slow,一个快指针fast,然后slow走一步,fast走两步,这样fast走完的时候slow刚好来到链表中间
快慢指针法就是通过只遍历一次就能达到对整体进行类似除法运算的功效,比如slow走1步fast走4步,fast走完,slow就走到整体的四分之一处
回到本题,在判断结束扫描的条件时要注意,先判断fast是否为NULL,利用短路的特性避免判断fast->next,因为如果fast为假了,去访问next的时候就会崩
struct ListNode* middleNode(struct ListNode* head)
{struct ListNode* slow = head;struct ListNode* fast = head;//有一个为假就跳出循环while (fast && fast->next){slow = slow->next;fast = fast->next->next;}return slow;
}
3. 反转链表
OJ链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

本体是说给一个单链表的头节点地址head,让反转链表,再将新链表的头返回,值得注意的是这个链表可能是个空链表
思路1:
和第一题类似,创建一个"新链表",每次将旧链表的第一个节点拿下来,头插到新链表
因为这题给的是单链表,不能用后面的节点访问前面的节点,所以不要想从最后一个节点开始改变链接方向,因为遍历到最后一个节点就找不到前面的节点了
思路2:
用3个指针n1、n2、n3,初始状态n1指向空,n2指向头节点,n3指向第二个节点。然后将n2节点的指向变成n1,然后把n1变到n2的位置,n2变到n3的位置,再把n3滑到下一个节点。然后在n2不为空的情况下一直循环这个操作。
struct ListNode* reverseList(struct ListNode* head)
{//如果传过来的是空链表if (head == NULL){return head;}struct ListNode* n1 = NULL;struct ListNode* n2 = head;struct ListNode* n3 = head->next;while (n2){n2->next = n1;n1 = n2;n3 = n2;//如果n3已经指向NULL了就不用往下滑了if (n3){n3 = n3->next;} }return n1;
}
4. 合并两个有序链表
OJ链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

本题是说,给两个升序链表的头节点地址list1和list2,然后将两个链表合并成一共新的升序链表,并返回新链表的头,值得注意的是给出的两个链表可能有空的
思路:
创建一个"新链表",再用顺序表中讲到的那道合并数组的题的思想
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2)
{//如果给出的某个链表为空,就返回另一个链表if (list1 == NULL){return list2;}if (list2 == NULL){return list1;}//两个扫描原链表的指针struct ListNode* p1 = list1;struct ListNode* p2 = list2;//两个控制新链表的指针struct ListNode* newhead = NULL;struct ListNode* newtail = NULL;//p1或p2有一个扫描完就退出循环while (p1 && p2){//如果p1扫到的数据更小if (p1->val < p2->val){//如果新链表中没有节点if (newhead == NULL){newhead = p1;newtail = p1;}//如果新链表不为空else{newtail->next = p1;newtail = p1;}p1 = p1->next;}//如果p2扫到的数据更小else{//如果新链表为空if (newhead == NULL){newhead = p2;newtail = p2;}//如果新链表不为空else{newtail->next = p2;newtail = p2;}p2 = p2->next;}}//处理旧链表没挪完的那部分if (p1){newtail->next = p1;}if (p2){newtail->next = p2;}return newhead;
}
5. 分割链表(带头链表的优势)
本题我会距离说明带头链表比不带头链表好在哪里
OJ链接:https://leetcode.cn/problems/partition-list-lcci/description/
本题给出一个链表的头节点地址,和一个特定的值x,要求是把所存数据小于x的节点堆在前面,把大于等于x的节点堆在后面,堆放的时候不需要保存节点原来相对位置的有关信息
思路1:
创建一个"新链表"把原链表中小于x的节点头插,把大于等于x的节点尾插
思路2:带头链表的优点
先说解题思路,我们创造两个"新链表",lesshead尾插小于x的节点,bighead尾插大于等于x的节点,最后把bighead连到lesshead后面
现在我们回忆一下,之前的代码再每次插入新节点的时候都要判断一下链表是否为空,这很麻烦。所以我们直接让链表带头,这样每次插入新节点的时候就不用判断了,因为链表一定不为空,它有一个不存储数据的头或者说"哨兵位",省去了插入时的很多麻烦
struct ListNode* partition(struct ListNode* head, int x)
{//判断传过来的是否时空链表if (head == NULL){return head;}//创建两个带头新链表struct ListNode* lesshead, * lesstail;struct ListNode* bighead, * bigtail;//申请头节点空间,并将其地址记录lesshead = lesstail = (struct ListNode*)malloc(sizeof(struct ListNode));bighead = bigtail = (struct ListNode*)malloc(sizeof(struct ListNode));//用pcur遍历原链表,将节点放到对应的新链表中struct ListNode* pcur = head;while (pcur){if (pcur->val < x){lesstail->next = pcur;lesstail = lesstail->next;}else{bigtail->next = pcur;bigtail = bigtail->next;}pcur = pcur->next;}//链接两个链表//先将大链表的尾置空bigtail->next = NULL;//再接上,注意要掠过大链表的那个没意义的头lesstail->next = bighead->next;//先存上小链表的第一个存有效数据的节点struct ListNode* ret = lesshead->next;//在释放两个新链表的头free(bighead);free(lesshead);return ret;
}
6. 环形链表的约瑟夫问题
OJ链接:环形链表的约瑟夫问题_牛客题霸_牛客网

本题······哎呀这题我就不复述了,人家题干说的挺清楚的
思路:循环链表
创建不带头单向循环链表,模拟围成一圈的人,逢m就删除节点
#include<stdlib.h>
//创建新节点
struct ListNode* BuyNode(int x)
{struct ListNode* newnode = (struct ListNode*)malloc(sizeof(struct ListNode));newnode->val = x;newnode->next = NULL;return newnode;
}
//创建链表
struct ListNode* creatlist(int n)
{//先创建一个头节点struct ListNode* phead = BuyNode(1);struct ListNode* ptail = phead;//再循环进行尾插,形成链表for (int i = 2; i <= n; i++){ptail->next = BuyNode(i);ptail = ptail->next;}//让链表首尾相连ptail->next = phead;return phead;
}int ysf(int n, int m)
{//创建不带头单向循环链表struct ListNode* phead = creatlist(n);struct ListNode* pcur = phead;struct ListNode* prev = NULL;//逢m删除节点,直到剩下最后一个节点int count = 1;while (pcur->next != pcur){if (m == count){//删除当前节点prev->next = pcur->next;free(pcur);count = 1;pcur = prev->next;}else{//pcur往后走prev = pcur;pcur = pcur->next;count++;}}return pcur->val;
}
不必担心当 m==1 的使得 prev->next 非法的情况,while的循环条件就已经把这种情况挡在外面了,而且题干里说了一定会剩下来一个人,所以返回pcur的数据也是没有问题的。
相关文章:
数据结构·单链表经典例题
1. 移除链表元素 OJ链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 本题是说给出一个链表的头节点head和一个整数val,如果发现节点中存的数据有val就删掉它,最后返回修改后的链表头节点地址 如果题目中没有明确…...
Linux常用指令的整合
之前面试被问到了Linux相关的指令,所以我整理的一份常用的Linux指令列表,适用于大多数Linux发行版,现分享给大家: 文件操作 ls:列出目录内容。cd [目录]:更改当前目录。pwd:显示当前目录路径。m…...
阿里云centos安装mysql,并修改初始密码
阿里云centos安装mysql,并修改初始密码 安装数据库、修改初始密码、并测试建立自己的数据库步骤1:创建数据库和用户步骤2:配置Nginx1. 创建新的站点配置文件2. 编辑配置文件3. 保存并退出编辑器4. 测试配置文件是否正确5. 重新加载 Nginx 以应…...
【JavaScript基础入门】04 JavaScript基础语法(二)
JavaScript基础语法(二) 目录 JavaScript基础语法(二)变量变量是什么声明变量变量类型动态类型注释 数字与运算符数字类型算术运算符操作运算符比较运算符逻辑运算符运算符的优先级 变量 变量是什么 在计算机中,数据…...
标准库中的string类(下)——“C++”
各位CSDN的uu们你们好呀,这段时间小雅兰的内容仍然是Cstring类的使用的内容,下面,让我们进入string类的世界吧!!! string类的常用接口说明 string - C Reference string类的常用接口说明 string类对象的修…...
如何使用Docker部署火狐浏览器并实现无公网ip远程访问
文章目录 1. 部署Firefox2. 本地访问Firefox3. Linux安装Cpolar4. 配置Firefox公网地址5. 远程访问Firefox6. 固定Firefox公网地址7. 固定地址访问Firefox Firefox是一款免费开源的网页浏览器,由Mozilla基金会开发和维护。它是第一个成功挑战微软Internet Explorer浏…...
瑞_数据结构与算法_AVL树
文章目录 1 什么是AVL树1.1 AVL树的背景及定义1.2 判断失衡1.2.1 平衡因子1.2.2 失衡的四种情况1.2.2.1 LL1.2.2.2 LR1.2.2.3 RL1.2.2.4 RR 1.3 解决失衡1.3.1 左旋(RR)1.3.2 右旋(LL)1.3.3 先左旋再右旋(LR࿰…...
BGP同步规则
BGP同步规则:开启同步下,从IBGP收到一条路由不会传给任何EBGP邻居(实验效果IBGP邻居和EBGP邻居都不传),除非从自身的IGP中也学到这条路由。目的是防止AS内部出现路由黑洞,向外部通告了一个本AS不可达的虚假的路由。 同步规则只影响从IBGP邻居收到的路由,不影响从EBGP邻居收…...
Linux命令-apt-key命令(管理Debian Linux系统中的软件包密钥)
补充说明 apt-key命令 用于管理Debian Linux系统中的软件包密钥。每个发布的deb包,都是通过密钥认证 的,apt-key用来管理密钥。 语法 apt-key(参数)参数 操作指令:APT密钥操作指令。 实例 apt-key list # 列出已保存在系统中key。 apt-…...
Python根据Excel表进行文件重命名
一、问题背景 在日常办公过程中,批量重命名是经常使用的操作。之前我们已经进行了初步探索,主要是通过批处理文件、renamer软件或者Python中的pathlib等模块对当前目录下的文件进行批量重命名。 而今天我们要使用的是PythonExcel的方法对指定目录下的文…...
【UVM源码】UVM Config_db机制使用总结与源码解析
UVM Config_db机制使用总结与源码解析 UVM Config_db机制介绍UVM Config_db 机制引入的背景基本介绍使用方法优缺点: UVM Config_db机制使用示例:UVM Config_db使用高阶规则Config_db资源优先级 UVM Config_db 源码解析 UVM Config_db机制介绍 UVM Conf…...
群辉开启WebDav服务+cpolar内网穿透实现移动端ES文件浏览器远程访问本地NAS文件
文章目录 1. 安装启用WebDAV2. 安装cpolar3. 配置公网访问地址4. 公网测试连接5. 固定连接公网地址6. 使用固定地址测试连接 本文主要介绍如何在群辉中开启WebDav服务,并结合cpolar内网穿透工具生成的公网地址,通过移动客户端ES文件浏览器即可实现移动设…...
通过mybatis拦截器给sql执行加一个耗时监控
代码没什么内容,直接贴上来吧,其中costTimeUtil可以看我的另一篇博文:java实现一个不带次数变量的加权平均值算法-CSDN博客 Slf4j Intercepts({Signature(type StatementHandler.class,method "query",args {Statement.class, …...
构建知识图谱:从技术到实战的完整指南
目录 一、概述二、知识图谱的基础理论定义与分类核心组成历史与发展 三、知识获取与预处理数据源选择数据清洗实体识别 四、知识表示方法知识表示模型RDFOWL属性图模型 本体构建关系提取与表示 五、知识图谱构建技术图数据库选择Neo4jArangoDB 构建流程数据预处理实体关系识别图…...
STM32的分类和选型
F系列(主要用于普通应用) STM32F0xx:低成本、低功耗,适用于成本敏感和低功耗的应用。STM32F1xx:中低端微控制器,具有丰富的外设和良好的性能。STM32F2xx:高性能微控制器,适用于要求…...
python使用read_sql与to_sql读写数据库
文章目录 详细说明示例程序 详细说明 使用pandas读写数据库的方法(以Mysql为例)如下: 首先是打包一个工具函数: import pandas as pd import numpy as np from sqlalchemy import create_engine, textdef get_sql_engine():# 数据…...
【ArcGIS微课1000例】0096:dem三维块状表达(层次地形模型)
文章目录 一、DEM表达方式二、层次模型表达三、注意事项一、DEM表达方式 DEM数字高程模型的表达方式通常有以下4种: 1. 规则格网 2. 不规则三角网 3. 等高线 4. 层次地形模型 作为栅格地理数据,DEM 数据具有2.5维的特征,能够以三维表面的形式进行三维空间表达。但受其数…...
OJ_糖果分享游戏
题干 c实现 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<vector> using namespace std;void ShareCandy(vector<int>& student) {int size student.size();vector<int> share(size); //保存每个同学交换前,糖果数量…...
sqli-lbs靶场搭建
目录 环境小皮源码下载 1.源码解压: 2.搭建网站 2.1点击创建网站 2.2修改sql-connections\db-creds.inc 2.3重新启动 3.访问你设置的域名 3.1点击启动数据库配置 3.2返回第一个页面(开启题目) sqlilbs靶场搭建 环境小皮源码下载 下载地址&am…...
SharedPreferences卡顿分析
SP的使用及存在的问题 SharedPreferences(以下简称SP)是Android本地存储的一种方式,是以key-value的形式存储在/data/data/项目包名/shared_prefs/sp_name.xml里,SP的使用示例及源码解析参见:Android本地存储之SharedPreferences源码解析。以…...
Nomic-Embed-Text-V2-MoE实战:构建智能文档检索系统与MySQL集成
Nomic-Embed-Text-V2-MoE实战:构建智能文档检索系统与MySQL集成 1. 引言 想象一下,你所在的公司有成千上万份产品手册、技术文档和合同文件,它们散落在各个文件夹里,格式五花八门。当你想找一份关于“如何解决产品X在低温环境下…...
3大突破!零门槛掌握资源嗅探:猫抓插件全平台使用指南
3大突破!零门槛掌握资源嗅探:猫抓插件全平台使用指南 【免费下载链接】cat-catch 猫抓 chrome资源嗅探扩展 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 一、为什么你需要专业的资源嗅探工具? 场景化痛点直击 作为…...
UnrealPakViewer实战指南:解决Pak文件解析难题的5个创新方法
UnrealPakViewer实战指南:解决Pak文件解析难题的5个创新方法 【免费下载链接】UnrealPakViewer 查看 UE4 Pak 文件的图形化工具,支持 UE4 pak/ucas 文件 项目地址: https://gitcode.com/gh_mirrors/un/UnrealPakViewer 当你面对10GB加密Pak包&…...
双模型对比:OpenClaw接入Qwen3.5-4B-Claude与原版效果实测
双模型对比:OpenClaw接入Qwen3.5-4B-Claude与原版效果实测 1. 测试背景与实验设计 去年在开发一个自动化文档处理工具时,我发现OpenClaw的任务成功率高度依赖底层模型的逻辑推理能力。当时使用的标准Qwen模型在处理多步骤任务时经常出现"跳步&quo…...
S32K144开发环境避坑指南:SDK选择与Segger JLink配置详解
S32K144开发环境避坑指南:SDK选择与Segger JLink配置详解 第一次接触NXP S32K144微控制器时,最令人头疼的莫过于开发环境的搭建。记得去年接手一个汽车电子项目,团队花了整整三天时间才让调试器正常工作——不是因为硬件问题,而是…...
lychee-rerank-mm快速上手:3步完成图库重排序(输入描述→上传图片→点击排序)
lychee-rerank-mm快速上手:3步完成图库重排序(输入描述→上传图片→点击排序) 1. 项目简介 lychee-rerank-mm是一个专门为RTX 4090显卡优化的智能图片排序工具。它能帮你从一堆图片中快速找出与文字描述最匹配的那些图片,就像有…...
Waymo Sim Agents模拟代理:多智能体交互建模实战指南
Waymo Sim Agents模拟代理:多智能体交互建模实战指南 【免费下载链接】waymo-open-dataset Waymo Open Dataset 项目地址: https://gitcode.com/gh_mirrors/wa/waymo-open-dataset Waymo Sim Agents模拟代理是Waymo开放数据集中的重要组成部分,专…...
签名计算效率工具:xhshow实现小红书API请求处理提速90%的技术原理揭秘
签名计算效率工具:xhshow实现小红书API请求处理提速90%的技术原理揭秘 【免费下载链接】xhshow 小红书xs纯算 小红书56版本xs 小红书个人主页 批量爬取数据 文章批量下载 小红书x-s x-t x-s-common x-b3-traceid search-id 旋转验证码参数纯算纯协议逆向 项目地址…...
MarkItDown:文档转换工具的全方位解析与高效应用指南
MarkItDown:文档转换工具的全方位解析与高效应用指南 【免费下载链接】markitdown 将文件和办公文档转换为 Markdown 的 Python 工具 项目地址: https://gitcode.com/GitHub_Trending/ma/markitdown 在数字化办公与内容创作领域,文档格式转换是连…...
告别臃肿控制中心,拥抱开源替代方案:G-Helper硬件调校效率提升指南
告别臃肿控制中心,拥抱开源替代方案:G-Helper硬件调校效率提升指南 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops. Control tool for ROG Zephyrus G14, G15, G16, M16, Flow X13, Flow X16, TUF, Strix, Scar and…...
