【编程之美】读书笔记:从无头单链表中删除结点

#数据结构:编写不带头结点单链表的建立、插入和删除算法 编写不带头结点单链表的建立、插入和删除操作算法。 一、问题描述 编写一个不带头节点的单链表 二、基本要求 1) 建立 2) 插入 3) 删除 三、算法思想 选用不带头结点的单链表,在第一个元素节点前插入节点时头指针的值将改变为指针s的值,在非第一个元素结点的其他结点前插入结点时,改变的是指针->next的值。 删除不带头结点的单链表的第一个元素结点时头指针的值将改变为头指针->next;删除其他节点是,头指针的值不会改变,改变的是指针->next的值。 四、数据结构 阅读详情

        问题:假设有一个没有头指针的单链表。一个指针指向此单链表中间的一个节点(不是第一个也不是最后一个),如何将该结点删除?

        分析:假设给定的指针为pCurrent,Node *pNext=pCurrent->Next(pNext指向pCurrent的下一个结点)。根据题意,pNext!=NULL.

若pCurrent指向中间要删除的节点B,如下图所示:

但是该链表没有头指针,无法扫描到结点A。但是我们可以换一种思路,可以将结点C的数据赋给B,然后将真正的C结点删除,因为删除C结点是很方便的,知道其前驱结点。

可以用下面代码实现:

pCurrent->Next=pNext->Next;

pCurrent->Data=pNext->Data;

delete pNext;

代码如下:

void DeleteNode(node * pCrrent)
{
Assert(pCurrent!=NuLL)
node *pNext=pCurrent->next;
if(pNext!=NULL)
{
pCurrent->Next=pNext->Next;
pCurrent->Data=pNext->Data;
delete pNext;
}

}


扩展问题:给定一个链表的头指针,只要求一次遍历,求单链表中的元素顺序反转过来。

可以用单链表的首插法来实现逆转。

代码如下:

void reverse(node *&head)
{
node *p,*s;
p=head->next;//取得头节点的后一个节点
head->next=NULL;//将头节点单独拿出来
//应用首插入法逆转
while(p!=NULL)
{
s=p; //将待插入的节点保存
p=p->next;
//开始插入
s->next=head->next;
head->next=s;
}
}


附加问题:没有头结点的单链表逆转问题

      这里用三个辅助指针来完成逆转,也可以给单链表加上一个头指针,采用上面的首插法逆转,逆转完成后删除首结点。

   代码如下:

void reverse(node *&head)
{
node *p,*q,*r;
p=head;
q=p->next;
while(q!=NULL)
{
r=q->next;
//开始逆转
q->next=p;
p=q;
q=r;
}
head->next=NULL; 将第一个节点的next置为空
head=p; //将p改为头节点
}


 

无头单链表删除一个节点 这是一个类似脑筋急转弯的题目,常规方法是直接将节点删除然后再将前面一个节点和后面的节点接上。但是由于本题目中的链表没有头,所以必然不是用这个方法。本题的技巧在于:只需要将当前节点的数据替换成后面一个节点的数据,然后将该节点后面一个节点删除即可。 #include typedef struct List{ int n; struct List *next; }ListNode,*List; 阅读详情

相关推荐

C语言数据结构2.16题

已知指针la和lb分别指向两个无头结点单链表中 的首元结点。 下列算法是从表la中删除自第i个元素起共 len个元素后,将它们插入到表lb中第i个元素之前。试问 此算法是否正确? 若有错,则请改正之。 实现下列函数: Status DeleteAndInsertSub(LinkList &la, LinkList &lb, int i, int j, int len); // la和lb分别指向两个单链表中第一个结点, */ /* 本算法是从la表中删去自第i个元素起共len个元素,*/ /* 并将它们插入到lb表中第j个元素之前, */ /* 若lb表中只有j-1个元素,则插在表尾。 */ 单链表类型定义如下: typedef struct LNode{ ElemType data; struct LNode *next; } LNode, *LinkList;

从无头单链表中删除节点

#include #include struct Node {     int nValue;     struct Node* next; }; void DeleteRandomNode(struct Node* pCurrent) {     if(pCurrent == NULL)     {         exit(0);     }     struct

x_xiaoge的专栏 549

无头节点的单链表

无头节点单链表的实现可是说是对C语言指针一个最直接、最贴合实际、也是最具有归纳性的程序设计应用。许多C语言基础面试题都涉及单链表的实现和构造,其目的就是考察面试者对C语言基础数据类型是否有足够的了解,对C语言指针是否掌握。链表的实现可以简单也可以很复杂,只是我们对待问题的态度不同,回想起了大学刚学习链表的时候,总是对链表中用到的结构体和链表节点有很多的迷茫,直到后来仔细研究了一番,并且写下了这个代码才解开了心中很久的困惑。 回看了一下自己写的这个单链表的实现,注释写的非常详细了,包括了单链表中二级指针的应用场景,为什么要使用二级指针这些问题都有一个详细的总结,也包括链表节点的结构体和学生个人信息结构体的这些区分。可以说是楼主就是从这个阶段才正真开始对结构体,对指针,对链表的“数据域”,“指针域”有了较为清晰的了解。 上传这些代码完全因为楼主确实想把自己学习过程中的遇到到一些问题和错误认识,以及一些经验共享出来,希望帮助那些和曾经的我一样充满迷茫困惑的同学朋友。

编程之美——从无头单链表中删除节点

编程之美——从无头单链表中删除节点      问题:假设有一个没有头指针的单链表。一个指针指向此单链表中间的一个节点,请将该节点从单链表中删除。     分析:典型的“狸猫换太子”, 若要删除该节点,正常情况下,应该要知道该节点的前面节点的指针,但是由于单链表中没有头结点,所以无法追溯到该节点前面的那个节点,因此,这里采用了“移花接木”的方法。设该节点为B,下一个节点为C。那么,首先将

chenglinhust的专栏 1046

纯C语言单链表的逆转,前驱插入,后驱插入,排序(适用于节点数据大,避免对数据拷贝的排序,可以对节点数据较大的程序提升性能)

纯C语言实现,将文件包下载到本地目录,直接make即可产生list文件,直接执行即可

GD32F450以太网(1):ETH 外设接口简介

GD32F450以太网ETH MAC外设接口简介

Zhichao_Zhang的博客 1万+

单链表--删除第i个结点

int listdelete (linklist &l, int i){ p = l; j = 0; while (p -> next && j < i - 1){ //p指向第i个节点的前驱 p = p -> next; j++; } if(!(p -> next) || i <= 0){ return error; } node * q = p ->

6935

6.4 构网型储能的需求与配置

摘要: 构网型储能是新型电力系统的关键支撑技术,通过提供电压/频率形成、惯性和稳定控制能力,解决同步机退出导致的系统稳定性问题。其配置需遵循三大原则:1)容量配置以支撑需求为主导,兼顾能量服务;2)优先布局于电网薄弱点、稳定问题突出区域;3)采用自适应控制策略实现全工况优化。核心应用场景包括新能源送出通道稳定、负荷中心调频、黑启动电源等。规划方法需结合系统分析、量化指标和成本效益评估,实现技术经济最优。未来需重点关注构网/跟网混合系统的临界容量占比及自适应控制技术发展。

技术工作者 1139

[读书笔记]编程之美(三)

[读书笔记]编程之美(三) 3.1字符串移位包含的问题 问题:给定两个字符串s1和s2,要求判定s2是否能够被s1做循环移位(rotate)得到的字符串包含。例如,给定s1=AABCD和s2=CDAA,返回true;给定s1=ABCD和s2=ACBD,返回false。 思路:str = s1 + s1,判断s2是否在str中。这种要申请新的空间,或者用指针做一个循环两次,这样就不用申请新...

xy_cpp的博客 524

CPU也能跑大模型?手把手教你用vLLM离线部署Qwen2.5-7B-Instruct(附性能优化技巧)

本文详细介绍了如何在CPU服务器上高效部署Qwen2.5-7B-Instruct模型,通过vLLM框架和一系列优化技巧实现离线推理。内容包括环境配置、模型加载优化、性能调优及生产环境部署方案,帮助开发者在资源有限的情况下也能运行大语言模型。

weixin_28691741的博客 489

LiveKit 本地部署实战:从零搭建安全实时通信环境(Caddy+HTTPS)

本文详细介绍了如何从零开始搭建LiveKit本地部署环境,结合Caddy服务器实现HTTPS安全通信。通过环境准备、证书生成、服务配置到前端客户端集成的完整流程,帮助开发者快速构建实时音视频应用,特别适合需要安全实时通信的场景。

weixin_29227585的博客 675

编程之美读书笔记_杂项

编程之美 读书笔记 1.1 让CPU占用率听你指挥P7页的那个汇编代码(16位)有点过时。另外,对32位汇编,空循环,常用到的寄存器是eax或ecx。  1.5 快速找出机器故障看了好几遍,还是看不懂题目,尽管猜到了要考什么。问题一问的有点莫名其妙,没说明为什么有个ID会只出现一次,只出现一次的ID是否只有一个;问题二的两个小问题本意都是要求找丢失的ID,但却把这个要求

flyinghearts的专栏 1246

SAP SM30数据维护实战:条件筛选与动态校验的实现技巧

本文详细介绍了SAP SM30数据维护的实战技巧,重点讲解如何通过条件筛选实现精准数据查取,以及利用表维护生成器事件实现动态数据检查与校验。文章提供了从基础视图创建到高级事件编程的完整流程,包括调用函数VIEW_MAINTENANCE_CALL传递筛选条件,以及在NEW_DATA和CHANGE_SAVE事件中编写业务规则校验逻辑,帮助开发者提升SM30的管控能力与数据质量。

q9w8e7r6t5的博客 521

数据结构与算法之美1_数组&链表

本系列文章,算是《极客时间》的《数据结构与算法之美》专栏的读书笔记。 只是一些个人心得与练习,想要得到更详细更好更系统的学习,请去 极客时间APP订阅专栏。 跟着专栏学了好久,也该有点成果不是; 正好趁着最后的几篇练习章节,把之前学到的,做个笔记总结一下。 笔记列表: 数组&链表 栈&队列&递归 排序&二分查找 回顾 数组 定义 数组是一种线性表数据结构。它...

继续激情,继续奋斗。 523

PVE启动卡在loading initial ramdisk

pve显卡直通导致的异常解决

学而时习之 6687

基于 ESP32-CAM 与 TinyML 的食堂餐盘自动识别与营养分析终端

【代码】基于 ESP32-CAM 与 TinyML 的食堂餐盘自动识别与营养分析终端。

weixin_42300449的博客 165

数据结构 在单链表和双链表中删除倒数第K个节点

程序员代码面试指南(左程云)读书笔记 2-1 第二章 在单链表和双链表中删除倒数第K个节点 题目:分别实现两个函数,一个可以删除单链表中倒数第K个节点,另一个可以删除双链表中倒数第K个节点。 要求:   如果链表长度为N,时间复杂度达到O(N),额外空间复杂度达到O(1) 单链表删除倒数第k个数 public class Node {  public

OY_palada 381

Oracle EBS Interface/API(49)- AP付款取消API

Oracle EBS AP付款取消API介绍和简单实例

陈显平的专栏-Oracle EBS 849

学习笔记之编程之美-微软技术面试心得(一)

书名编程之美-微软技术面试心得  《编程之美》小组 著 从书名就可以知道该书的大体内容了,书中收集约60道算法和程序设计的题目。网上可以找到书中部分章节以及随书源代码,不过我还是喜欢翻书看的感觉。下面是对书中结构之法章节的读书笔记,该节汇集了常见的对字符串、链表、队列,以及树等进行操作的题目。 3.1  字符串移位包含的问题 题目要求判断一字符串能否通过循环移位得到另一字符串。 ...

weixin_34150830的博客 214

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

链表数据结构讲解 --数据结构与算法之美读书笔记

链表(上) 1、数组和链表区别 数组需要一块连续的内存空间来存储,链表恰好相反,并不需要一块连续的内存空间,通过“指针”将一组零散的内存卡串联起来使用。 2、常见的链表结构 单链表: 第一个点叫作头结点,最后一个节点叫作尾结点。头结点记录链表的基地址,尾结点的下一个指向空地址null。链表插入和删除操作的时间复杂度是O(1)。链表的随机访问时间复杂度未O(n)。 循环链表: 循环链表...

haochajin的博客 242

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

读书笔记01--数据结构与算法分析:表、栈、队列以及C编程实现

抽象数据类型,是一些操作的集合,用来描述数据的取值范围、结构和功能。我们知道实数、整数和布尔量这些数据类型有与它们相关的操作,而表、集合、图以及与它们相关的操作就可以看做是抽象数据类型。

XIAOXVPAIDAXING的博客 1896

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

单链表的选择排序

程序员代码面试指南(左程云)读书笔记  第三章 单链表的选择排序 题目:       给定一个无序单链表的头节点head,实现单链表的选择排序。       要求:额外空间复杂度为O(1)  既然要求额外空间复杂度为O(1),就不能把链表装进数组等容器中排序,排好序之后再重新连接,而是要求在原链表上利用几个有限的变量完成排序过程,解法如下:     1.开始时默认整个链表都是未排序部

OY_palada 887

数据结构----读书笔记二(线性表的知识点)

在大话数据结构中,之后的内容应该最好是编程实现会比较有感触,所以,在之后的学习中,书本是用C写的,我会用Python再重新书写一遍,以便更好的记忆和学习。 第三章,线性表的内容 线性表指的是逻辑结构是线性的情况,逻辑结构是线性的情况中,说明数据元素之间具有有序性以及有限性,也就是数据元素有限个,并且数据元素之间的排列是线性的,也就是排列的规律性是依次的情况,或者可以说具有某种一一对应的关系?哈

赵小越的博客 524

大话数据结构读书笔记 1---线性表

大话数据结构读书笔记编程基础: 数据结构 算法1 线性表//顺序储存结构的结构代码: #define MAXSIZE 20//储存空间的起始分配量 typedef int ElemType;//ElemType类型根据实际类型而定,这里假设是int typedef struct{ ElemType data[MAXSIZE];//数组储存元素,最大值为MAXSIZE int length;/线性表

yarsnwoing的博客 3131

《大话数据结构》读书笔记--第3章 线性表

文章目录3.2 线性表的定义3.3 线性表的抽象数据类型3.4 线性表的顺序存储结构3.4.1 顺序存储的定义3.4.2 顺序存储方式3.4.3 数组长度和线性表长度区别3.4.4 地址计算方法3.5 顺序存储结构的插入与删除3.5.1 获取元素操作3.5.2 插入操作3.5.3 删除操作线性表顺序存储结构的优缺点3.6 线性表的链式存储结构3.6.1 顺序存储结构不足的解决办法3.6.2 线性表...

soleil雪寂 965

《剑指Offer》读书笔记(2)——第二章 编程语言

目录前言正文在C++中,有哪4个与类型转换相关的关键字?参考 前言 这是第二章,这章的内容相对第一章会充实很多,这章的内容主要讲解一些c++编程语言所应该注意的一些知识。 正文 在C++中,有哪4个与类型转换相关的关键字? reinterpret_cast<type_id>(expression) reinterpret_cast是C++里面的一个强制类型转换符,能够将任何的指针类型转换成其他的任何指针类型;能够将任何的整数类型转换成指针类型,反之亦然;滥用reinterpret_cast

保持一颗敬畏之心,简单地调用C++,适当地向C++妥协,让以后的自己看懂代码,让别人看懂代码。 692
上一篇: 【编程之美】读书笔记:求数组的子数组之和的最大值
下一篇: 【编程之美】读书笔记:寻找数组中的最大值和最小值
xiaoding133
博客等级 码龄19年 415粉丝 159原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值