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

【考研复习】24王道数据结构课后习题代码|2.3线性表的链式表示

文章目录

  • 总结
  • 01 递归删除结点
  • 02 删除结点
  • 03 反向输出
  • 04 删除最小值
  • 05 逆置
  • 06 链表递增排序
  • 07 删除区间值
  • 08 找公共结点
  • 09 增序输出链表
  • 10 拆分链表--尾插
  • 11 拆分链表--头插
  • 12 删除相同元素
  • 13 合并链表
  • 14 生成含有公共元素的链表C
  • 15 求并集
  • 16 判断子序列
  • 17 判断循环链表是否对称
  • 18 两个循环链表链接
  • 19 找最小结点并删除
  • 21 判断单链表是否有环
  • 22 【2009真题】找倒数第k个元素
  • 23 【2012真题】相同后缀找起始位置
  • 24 【2015真题】删除绝对值相同
  • 25 【2019真题】重新排列链表

总结

  • 删除结点:1、2、4
  • 就地逆置:5、
  • 合并链表
  • 分解链表:10、11、
  • 去除重复元素:12、
  • 并集:14、15
  • 循环链表:17、18、19、20
  • 头插法、尾插法重点基础必掌握。
  • 判断是否有环:21

01 递归删除结点

用函数递归调用删除结点。

void deletex(linklist &L,int x){if(L==NULL) return;lnode *p;if(L->data==x){p=L;L=L->next;free(p);deletex(L,x);}else deletex(L->next,x);
}

02 删除结点

注意删除结点的时候可能断链。

void deletex2(linklist &L,int x){lnode *p=L->next,*pre=L,*q;while(p){if(p->data==x){q=p;p=p->next;pre->next=p;free(q);}else{pre=p;p=p->next;}}
}

03 反向输出

利用函数调用的特性反向输出。

void r_print(linklist L){if(L!=NULL){r_print(L->next);cout<<(L->data)<<" ";}else return;
}
void r_ignore_node(linklist L){if(L->next!=NULL){r_print(L->next);}
}

04 删除最小值

  1. 设置保留最小值的指针和其前驱
  2. 每次更新最小值
void delete_min(linklist L){lnode *p=L->next,*pre=L;lnode *minp=p,*minpre=pre;while(p){if(p->data<minp->data){minp=p;minpre=pre;}else{p=p->next;pre=pre->next;}}minpre->next=minp->next; //删除最小值结点free(minp);
}

05 逆置

很重要的基础:头插法

void head(linklist &L){lnode *p=L->next,*r;L->next=NULL;while(p){r=p->next;      //记录下一结点p->next=L->next;L->next=p;p=r;}
}

06 链表递增排序

使用插入排序的思想,将头置空之后,扫描最小元素,然后使用尾插法插入头中。

void insert_sort(linklist &L){lnode *p=L->next,*r=p->next,*pre;p->next=NULL;p=r;while(p){r=p->next;pre=L;while(pre->next!=NULL&&pre->next->data<p->data){pre=pre->next;}p->next=pre->next;pre->next=p;p=r;}
}

07 删除区间值

2题的删除代码,改下if语句即可。

void delete_x_m_n(linklist &L,int m, int n){lnode *p=L->next,*pre=L,*q;while(p){if(p->data<n&&p->data>m){q=p;p=p->next;pre->next=p;free(q);}else{pre=p;p=p->next;}}
}

08 找公共结点

linklist find_same_dot(linklist L1,linklist L2){linklist longlist, shortlist;int dist=0;int len1=length(L1),len2=length(L2);if(len1>len2){longlist=L1;shortlist=L2;dist=len1-len2;}else{longlist=L2;shortlist=L1;dist=len2-len1;}while(dist--) longlist=longlist->next;while(longlist){if(longlist->data==shortlist->data&&longlist->next->data==shortlist->next->data)return longlist;else{longlist=longlist->next;shortlist=shortlist->next;}}return NULL;
}

09 增序输出链表

6题

void min_output(linklist L){while(L->next){lnode *pre=L,*p=L->next;lnode *minpre=pre, *minp=p;while(p){if(p->data<minp->data){minp=p;minpre=pre;}p=p->next;pre=pre->next;}cout<<minp->data<<" ";minpre->next=minp->next;free(minp);}
}

10 拆分链表–尾插

第一种方法是在A中直接删除。

linklist split_1_1(linklist &A){linklist B = (linklist)malloc(sizeof(lnode));B->next=NULL;lnode *p=A->next,*ra=A;lnode *rb=B,*q;while(p){//向后移一个ra=p;p=p->next;//从A中删除结点q=p;ra->next=p->next;p=p->next;//利用尾插法将结点插入B中rb->next=q;rb=rb->next;}ra->next=NULL;rb->next=NULL;return B;
}

第二种方法是把A的头拿下来,再选最小的排在A后。=尾插==

linklist split_1_2(linklist &A){linklist B = (linklist)malloc(sizeof(lnode));B->next=NULL;lnode *p=A->next,*ra=A;lnode *rb=B;//把表头摘下来A->next=NULL;while(p){//结点给Ara->next=p;ra=ra->next;p=p->next;//结点给Brb->next=p;rb=rb->next;p=p->next;}ra->next=NULL;rb->next=NULL;return B;
}

11 拆分链表–头插

第一种方法同上

linklist split_1_1(linklist &A){linklist B = (linklist)malloc(sizeof(lnode));B->next=NULL;lnode *p=A->next,*ra=A;lnode *rb=B,*q;while(p){//向后移一个ra=p;p=p->next;//从A中删除结点q=p;ra->next=p->next;p=p->next;//利用头插法将结点插入B中q=p->next;p->next=rb->next;rb->next=p;p=q;}ra->next=NULL;return B;
}

第二种方法同上

linklist split_2_1(linklist &A){linklist B = (linklist)malloc(sizeof(lnode));B->next=NULL;lnode *p=A->next,*ra=A;lnode *rb=B,*q;//把表头摘下来A->next=NULL;while(p){//结点给Ara->next=p;ra=ra->next;p=p->next;//结点给Bif(p){q=p->next;p->next=rb->next;rb->next=p;p=q;}}ra->next=NULL;//b是头插法所以最后指向是为NULLreturn B;
}

12 删除相同元素

简单代码,只不过要注意的p是要删除结点的前一个结点,判断的时候别判断错了。

void del_same(linklist &L){lnode *p=L->next,*q;if(p==NULL) return;while(p->next){q=p->next;if(p->data==q->data){p->next=q->next;free(q);}else{p=p->next;}}
}

13 合并链表

void merge(linklist &L1,linklist &L2)
{lnode *p1=L1->next,*p2=L2->next,*r;L1->next=NULL;while(p1&&p2){if(p1->data<=p2->data){r=p1->next;p1->next=L1->next;L1->next=p1;p1=r;}else{r=p2->next;p2->next=L1->next;L1->next=p2;p2=r;}}if(p1) p2=p1;while(p2){r=p2->next;p2->next=L1->next;L1->next=p2;p2=r;}free(L2);
}

14 生成含有公共元素的链表C

  1. 两个链表分别遍历,比较值头插入C中
linklist merge_same(linklist &A,linklist &B){lnode *p=A->next,*q=B->next;lnode *r,*s;linklist C = (linklist)malloc(sizeof(lnode));r=C;while(p&&q){if(p->data<q->data){p=p->next;}else if(p->data>q->data){q=q->next;}else{s=(lnode *)malloc(sizeof(lnode *));s->data=p->data;r->next=s;r=r->next;p=p->next;q=q->next;}}r->next=NULL;return C;
}

15 求并集

  1. 值不相同时分别删除A和B中的值
  2. 相同时删除B中的值
  3. 基础就是删除代码
void intersection(linklist &A,linklist &B){lnode *p=A->next,*q=B->next;lnode *r=A,*temp;while(p&&q){if(p->data<q->data){temp=p;p=p->next;free(temp);}else if(p->data>q->data){temp=q;q=q->next;free(temp);}else{//相等的时候保留A中相同元素r->next=p;r=r->next;p=p->next;//删除B中相同的元素temp=q;q=q->next;free(temp);}}while(p){temp=p;p=p->next;free(temp);}while(q){temp=q;q=q->next;free(temp);}r->next=NULL;
}

16 判断子序列

朴素kmp,也有所说bf的

bool simple_kmp(linklist &A,linklist &B){lnode *p=A->next,*q=B->next,*r=A->next;while(p&&q){if(p->data!=q->data){r=r->next;p=r;q=A->next;}else{p=p->next;q=q->next;}}if(q) return false;else return true;
}

17 判断循环链表是否对称

循环链表就方便了,能找前驱和后继,两个指针同时移动判断值即可。

bool symmetry(linklist L)
{lnode *p=L->next,*q=L->prior;while(p!=q&&q->next!=p){if(p->data==q->data){p=p->next;q=q->prior;}else return false;}return true;
}

18 两个循环链表链接

注意头尾即可

void add(linklist &h1,linklist &h2)
{lnode *p=h1->next,*q=h2->next;while(p->next!=h1){p=p->next;}while(q->next!=h2){q=q->next;}p->next=h2->next;//初始化的链表带头结点,若不带h2即可q->next=h1;
}

19 找最小结点并删除

  1. 遍历链表每次输出最小结点然后删除即可
    相同代码见9题
void find_min(linklist &L){while(L->next!=L){lnode *pre=L,*p=L->next;lnode *minpre=pre, *minp=p;while(p!=L){if(p->data<minp->data){minp=p;minpre=pre;}p=p->next;pre=pre->next;}cout<<minp->data<<" ";minpre->next=minp->next;free(minp);}free(L);
}

21 判断单链表是否有环

  1. 两步走总能相遇,按照这个作为遇到的条件找相遇点和入环结点。
    25题也是两步走。
lnode* findd(lnode *L)
{lnode *f=L,*s=L;while(s!=NULL&&f->next!=NULL){s=s->next;f=f->next->next;if(s->data==f->data) break; //可以直接设置指针,但是我初始化的有单链表为int a[15]={1,2,3,4,5,6,7,8,9,4,5,6,7,8,9};故用这种方法}if(s==NULL||f->next==NULL) return NULL;lnode *p=L,*q=s;while(p->data!=q->data){p=p->next;q=q->next;}return p;
}

22 【2009真题】找倒数第k个元素

  1. 相当于用长度为k的尺子比着找,最右端到尾部的时候,最左端就是倒数第k个元素。
int findk(linklist &L, int k){lnode *p=L,*q=L;int count=0;while(p){if(count<k) count++;else q=q->next;p=p->next;}if(count<k) return 0;else cout<<"kth to last position: "<<q->data;return 1;
}

23 【2012真题】相同后缀找起始位置

  1. 把尾部排齐:两个指针遍历链表,长度相同时找到相同时尾部对齐了
  2. 排齐之后遍历两个链表找第一个不相同的位置,该位置的下一个位置就是相同后缀的位置
typedef struct lnode{int data;struct lnode *next;
}lnode,*linklist;
lnode * find_addr(linklist str1, linklist str2){lnode *p,*q;int m=length(str1);int n=length(str1);for(p=str1;m>n;m--) p=p->next;for(q=str2;m<n;n--) q=q->next;while (p->next!=NULL&&q->next!=NULL){p=p->next;q=q->next;}return p->next;
}

24 【2015真题】删除绝对值相同

要求时间复杂度尽可能高➡️空间换时间

  1. 数组存查找状态:0表示绝对值未找到,1表示找到,第二次找到的同时删除该结点
  2. 注意动态分配数组的使用(静态数组试了试内存超出,不知道是不是这个问题)
void same(linklist &L,int n)
{lnode *p=L;int *q;q=(int *)malloc(sizeof(int)*(n+1));for(int i=0;i<n+1;i++) *(q+i)=0;int s;lnode *f;while(p->next!=NULL){s=abs(p->next->data);if(*(q+s)==0) {*(q+s)=1;p=p->next;}else{f=p->next;p->next=f->next;free(f);}}free(q);
}

25 【2019真题】重新排列链表

  1. 两步走找中间结点
  2. 逆置后边链表:使用头插法
  3. 看成两个链表进行插入
    21也是两步走
void change(linklist &L){lnode *p,*q,*r,*s;p=q=L;while (q->next){p=p->next;q=q->next;if(q->next) q=q->next;}q=p->next;  //p现在在中间结点p->next=NULL;  //把后半段摘下来,逆置之后分别遍历两个链表插入指定位置while (q)  //头插法实现原地逆置{r=q->next;  //暂存后继结点q->next=p->next;  //将q结点放在头结点p之后p->next=q;q=r;}s=L->next;  //插入点q=p->next;  //后半段数据点p->next=NULL;  while(q){r=q->next;q->next=s->next;s->next=q;s=q->next;q=r;}
}

相关文章:

【考研复习】24王道数据结构课后习题代码|2.3线性表的链式表示

文章目录 总结01 递归删除结点02 删除结点03 反向输出04 删除最小值05 逆置06 链表递增排序07 删除区间值08 找公共结点09 增序输出链表10 拆分链表--尾插11 拆分链表--头插12 删除相同元素13 合并链表14 生成含有公共元素的链表C15 求并集16 判断子序列17 判断循环链表是否对称…...

娇滴滴的一朵花(Python实现)

目录 1 娇滴滴的她 2 Python代码实现 1 娇滴滴的她 娇滴滴。双眉敛破春山色。春山色。 为君含笑,为君愁蹙。多情别後无消息。 此时更有谁知得。谁知得。夜深无寐&#xff0c;度江横笛。 2 Python代码实现 import turtle from turtle import * turtle.title(春天送她一朵小花)…...

Android AccessibilityService研究

AccessibilityService流程分析 AccessibilityService开启方式AccessibilityService 开启原理 AccessibilityService开启方式 . 在Framework里直接添加对应用app 服务component。 loadSetting(stmt, Settings.Secure.ACCESSIBILITY_ENABLED,1); loadSetting(stmt, Settings.Se…...

华为OD机试(含B卷)真题2023 算法分类版,58道20个算法分类,如果距离机考时间不多了,就看这个吧,稳稳的

目录 一、数据结构1、线性表2、优先队列3、滑动窗口4、二叉树5、并查集6、栈 二、算法1、基础算法2、字符串3、图4、动态规划5、数学 三、漫画算法2&#xff1a;小灰的算法进阶参与方式 很多小伙伴问我&#xff0c;华为OD机试算法题太多了&#xff0c;知识点繁杂&#xff0c;如…...

JMeter命令行执行+生成HTML报告

1、为什么用命令行模式 使用GUI方式启动jmeter&#xff0c;运行线程较多的测试时&#xff0c;会造成内存和CPU的大量消耗&#xff0c;导致客户机卡死&#xff1b; 所以一般采用的方式是在GUI模式下调整测试脚本&#xff0c;再用命令行模式执行&#xff1b; 命令行方式支持在…...

学习Boost二:从附录3来看编码习惯

附录C 关键字浅谈 在C11标准中&#xff08;C11.2.12&#xff09;总共定义了73个关键字&#xff08;keyword&#xff09;、2个“准”关键字&#xff08;identifiers with special meaning&#xff09;和11个操作符替代字&#xff08;alternative representation&#xff09;[1]。…...

STM32基础入门学习笔记:核心板 电路原理与驱动编程

文章目录&#xff1a; 一&#xff1a;LED灯操作 1.LED灯的点亮和熄灭 延迟闪烁 main.c led.c led.h BitAction枚举 2.LED呼吸灯&#xff08;灯的强弱交替变化&#xff09; main.c delay.c 3.按键控制LED灯 key.h key.c main.c 二&#xff1a;FLASH读写程序(有…...

最后一次模拟考试题解

哦我想这不用看都知道是为了水任务 T1 黑白染色 其实这题有原 什么手写体 md (指 markdown) 分析 首先这题如果你题目没看错的话 ,会发现其实他是 n m n \times m nm 让你求 n n n \times n nn 的区域内的点&#xff08;不会只有我一个人题目看错了罢 然后我们会发现…...

Mac 创建和删除 Automator 工作流程,设置 Terminal 快捷键

1. 创建 Automator 流程 本文以创建一个快捷键启动 Terminal 的自动操作为示例。 点击打开 自动操作&#xff1b; 点击 新建文稿 点击 快速操作 选择 运行 AppleScript 填入以下内容 保存名为 “Open Terminal” 打开 设置 > 键盘&#xff0c;选择 键盘快捷键 以此选择 服…...

2023华为OD机试真题B卷 Java 实现【最长的元音串】

前言 本题使用Java解答,如果需要Python代码,链接 题目 给定一个只由英文字母(a-z, A-Z)组成的字符串,找出其中最长的只包含元音字母(a, e, i, o, u, A, E, I, O, U)的子串,并返回其长度。如果不存在元音子串,则返回0。 输入: 一个由英文字母组成的字符串,长度大…...

网络防御之传输安全

1.什么是数据认证&#xff0c;有什么作用&#xff0c;有哪些实现的技术手段? 数据认证是一种权威的电子文档 作用&#xff1a;它能保证数据的完整性、可靠性、真实性 技术手段有数字签名、加密算法、哈希函数等 2.什么是身份认证&#xff0c;有什么作用&#xff0c;有哪些…...

【css】组合器

组合器是解释选择器之间关系的某种机制。在简单选择器器之间&#xff0c;可以包含一个组合器&#xff0c;从而实现简单选择器难以达到的效果。 CSS 中有四种组合器&#xff1a; 后代选择器 (空格)&#xff1a;匹配属于指定元素后代的所有元素&#xff0c;示例&#xff1a;div …...

HTTPS、TLS加密传输

HTTPS、TLS加密传输 HTTPS、TLS加密传输1、HTTPS&#xff08;HyperText Transfer Protocol Secure&#xff09;2、TLS HTTPS、TLS加密传输 1、HTTPS&#xff08;HyperText Transfer Protocol Secure&#xff09; HTTPS&#xff08;HyperText Transfer Protocol Secure&#x…...

docker frp 搭建 http + stcp 代理

所需服务器 2台 一台具有国外公网ip 一台具有国内 ip 内网外网都可以 外公网ip服务器配置如下 cat docker-compose.yamlversion: "2" services:frps:image: alpine:latesthostname: frpsrestart: alwayscontainer_name: frpsprivileged: trueuser: rootcommand: […...

项目出bug,找不到bug,如何拉回之前的版本

1.用gitee如何拉取代码 本文为转载于「闪耀太阳a」的原创文章原文链接&#xff1a;https://blog.csdn.net/Gufang617/article/details/119929145 怎么从gitee上拉取代码 1.首先找到gitee上想要拉取得代码URL地址 点击复制这里的https地址 1 ps:&#xff08;另外一种方法&…...

vue-cli

vue-cli脚手架 案例一&#xff1a; 案例二&#xff1a; 案例三&#xff1a; ​ 一、脚手架简介 Vue脚手架是Vue官方提供的标准化开发工具&#xff08;开发平台&#xff09;&#xff0c;它提供命令行和UI界面&#xff0c;方便创建vue工程、配置第三方依赖、编译vue工程 1. …...

android获取屏幕分辨率的正确方法;获取到分辨率(垂直方向像素)的不正确

我通过下面的方法去获取屏幕分辨率的&#xff0c;但获取到的分辨率有时会不准确。原因是此方法有时候会忽略一些布局或控件的高度&#xff0c;从而得不到正确的高度。 public static String getDeviceResolution(Context context){//从系统服务中获取窗口管理器WindowManager w…...

机器学习笔记之优化算法(八)简单认识Wolfe Condition的收敛性证明

机器学习笔记之优化算法——简单认识Wolfe Condition收敛性证明 引言回顾&#xff1a; Wolfe \text{Wolfe} Wolfe准则准备工作推导条件介绍推导结论介绍 关于 Wolfe \text{Wolfe} Wolfe准则收敛性证明的推导过程 引言 上一节介绍了非精确搜索方法—— Wolfe \text{Wolfe} Wolf…...

通过win+r安装jupyter报错

通过pip install jupyter安装jupyter报错处理办法 1、python 更新到最新版&#xff0c;最好多执行几次后在安装jupyter python.exe -m pip install --upgrade pip 2、通过镜像安装 pip install jupyter --force-reinstall pip -i http://pypi.douban.com/simple/ --trusted-h…...

C#声明一个带返回值的委托

1、声明 public delegate string TestDel(string str); 2、使用 TestDel t; t (string str) > str; t (string str) > str "1"; t (string str) > str "2"; t (string str) > str "3"; Console.WriteLine(t ("hhhh&qu…...

无法与IP建立连接,未能下载VSCode服务器

如题&#xff0c;在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈&#xff0c;发现是VSCode版本自动更新惹的祸&#xff01;&#xff01;&#xff01; 在VSCode的帮助->关于这里发现前几天VSCode自动更新了&#xff0c;我的版本号变成了1.100.3 才导致了远程连接出…...

ESP32读取DHT11温湿度数据

芯片&#xff1a;ESP32 环境&#xff1a;Arduino 一、安装DHT11传感器库 红框的库&#xff0c;别安装错了 二、代码 注意&#xff0c;DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...

2025盘古石杯决赛【手机取证】

前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来&#xff0c;实在找不到&#xff0c;希望有大佬教一下我。 还有就会议时间&#xff0c;我感觉不是图片时间&#xff0c;因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...

unix/linux,sudo,其发展历程详细时间线、由来、历史背景

sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...

C# SqlSugar:依赖注入与仓储模式实践

C# SqlSugar&#xff1a;依赖注入与仓储模式实践 在 C# 的应用开发中&#xff0c;数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护&#xff0c;许多开发者会选择成熟的 ORM&#xff08;对象关系映射&#xff09;框架&#xff0c;SqlSugar 就是其中备受…...

零基础设计模式——行为型模式 - 责任链模式

第四部分&#xff1a;行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习&#xff01;行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想&#xff1a;使多个对象都有机会处…...

rnn判断string中第一次出现a的下标

# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...

初探Service服务发现机制

1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能&#xff1a;服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源&#xf…...

C/C++ 中附加包含目录、附加库目录与附加依赖项详解

在 C/C 编程的编译和链接过程中&#xff0c;附加包含目录、附加库目录和附加依赖项是三个至关重要的设置&#xff0c;它们相互配合&#xff0c;确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中&#xff0c;这些概念容易让人混淆&#xff0c;但深入理解它们的作用和联…...

苹果AI眼镜:从“工具”到“社交姿态”的范式革命——重新定义AI交互入口的未来机会

在2025年的AI硬件浪潮中,苹果AI眼镜(Apple Glasses)正在引发一场关于“人机交互形态”的深度思考。它并非简单地替代AirPods或Apple Watch,而是开辟了一个全新的、日常可接受的AI入口。其核心价值不在于功能的堆叠,而在于如何通过形态设计打破社交壁垒,成为用户“全天佩戴…...