【数据结构】单链表OJ题

 

🔥博客主页:小王又困了

📚系列专栏:数据结构

🌟人之为学,不日近则日退 

❤️感谢大家点赞👍收藏⭐评论✍️


目录

一、移除链表元素

💡方法一:

💡方法二:

二、链表的中间节点

💡方法一:

三、链表中倒数第k个结点

💡方法一:

四、反转链表

💡方法一:

💡方法二:

五、合并两个有序链表

💡方法一: 


🗒️前言:

在上一期中我们给大家介绍了单链表,也了解了单链表的实现。接下来就让我们进入实践,练习一些经典题目,让我们对单链表的理解更加深入。

一、移除链表元素

题目:

💡方法一:

我们使用两个指针遍历数组,遇到与 val 相同的数据域,就删除这个节点。我们在思考问题时要想全面,当要删除头节点时,常规方法就无法实现,对于删除头节点要做单独处理。

🍩常规删除: 

 🍩头节点删除

struct ListNode* removeElements(struct ListNode* head, int val)
{struct ListNode* prev=NULL;struct ListNode* cur=head;while(cur!=NULL){//删除if(val==cur->val){//头删if(cur==head){head=cur->next;free(cur);cur=head;}//常规else{prev->next=cur->next;free(cur);cur=prev->next;}}//遍历else{prev=cur;cur=cur->next;}}return head;
}

💡方法二:

我们通过遍历,把节点的数据域不等于val的节点尾接到新的链表中。我们要考虑第一个节点是不是要删除的。最后一个节点的指针域置空要放在循环结束后,判断tail是否为空指针。

struct ListNode* removeElements(struct ListNode* head, int val)
{struct ListNode* newhead=NULL;struct ListNode* tail=NULL;struct ListNode* cur=head;while(cur){if(cur->next==val){//删除struct ListNode* del=cur;cur=cur->next;free(del);}else{//尾插if(tail==NULL){newhead=tail=cur;//tail=cur;}else{tail->next=cur;tail=tail->next;   }cur=cur->next;}}if(tail){tail->next=NULL;}return newhead;
}

二、链表的中间节点

题目:

💡方法一:

我们可以定义两个指针,快指针一次走两步,慢指针一次走一步,当快指针走到结尾时,慢指针正好走了一半,这样我们就可以找到中间节点。

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

三、链表中倒数第k个结点

题目:

 

💡方法一:

我们可以参考上一题的方法,同样定义快慢指针,想让快指针走k步,然后在同时走,走到fast为空指针就找了倒数第k个节点。有可能链表没有k个节点,所以我们要加入判断。

struct ListNode* FindKthToTail(struct ListNode* pListHead, int k ) 
{struct ListNode* fast=pListHead;struct ListNode* slow=pListHead;while(k--){//链表没有k步长if(fast==NULL){return NULL;}fast=fast->next;}while(fast!=NULL){fast=fast->next;slow=slow->next;}return slow;
}

四、反转链表

题目:

💡方法一:

我们定义三个指针n1,n2,n3,来改变节点链接的顺序。将头节点变为尾节点,当n2为空指针时,n1就为链表的头节点,只需返回n1就可以。两个指针倒方向,一个指针保持下一个。

struct ListNode* reverseList(struct ListNode* head)
{struct ListNode* n1=NULL;struct ListNode* n2=head;struct ListNode* n3;if(n2){n3=n2->next;}while(n2){n2->next=n1;//往后走n1=n2;n2=n3;if(n3){n3=n3->next;}}return n1;
}

💡方法二:

将链表的节点一个一个拿下来,进行头插。这里要注意赋值的顺序。

struct ListNode* reverseList(struct ListNode* head)
{struct ListNode* cur=head;struct ListNode* newnode=NULL;while(cur){//保存节点struct ListNode* next=cur->next;//头插cur->next=newnode;newnode=cur;cur=next;}return newnode;
}

五、合并两个有序链表

题目:

💡方法一: 

我们创建一个带哨兵位的链表,这样在尾插时就不用判断是否是第一个节点,可以提高效率。要记住在最后要将哨兵位的空间释放。

struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2)
{if(list1==NULL){return list2;}if(list2==NULL){return list1;}struct ListNode* head=NULL;struct ListNode* tail=NULL;//创建一个哨兵位head=tail=(struct ListNode*)malloc(sizeof(struct ListNode));while(list1&&list2){if(list1->val<list2->val){tail->next=list1;tail=tail->next;list1=list1->next;}else{tail->next=list2;tail=tail->next;list2=list2->next;}}if(list1){tail->next=list1;}if(list2){tail->next=list2;}struct ListNode* del=head;head=head->next;free(del);return head;
}

本次的内容到这里就结束啦。希望大家阅读完可以有所收获,同时也感谢各位读者三连支持。文章有问题可以在评论区留言,博主一定认真认真修改,以后写出更好的文章。你们的支持就是博主最大的动力。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

用excel格式书写的接口用例执行脚本

创建测试用例和测试结果集文件夹&#xff1a; excel编写的接口测试用例如下&#xff1a; 1 encoding 响应的编码格式。所测项目大部分是utf-8&#xff0c;有一个特殊项目是utf-8-sig 2 params 对应requests的params 3 data&#xff0c;对应requests的data 有些参数是动态的&a…

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

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

Jenkins+Nginx+vue

安装nodejs 在这里插入图片描述 echo off xcopy C:\ProgramData\Jenkins\.jenkins\workspace\super_manage_vue\dist F:\java\www\super_manage_vue\ /s /e /y echo 复制文件完成 exit安装niginx 配置文件如下 #user nobody; worker_processes 1;#error_log logs/error.lo…

IDS详解

1、什么是ids&#xff1f; IDS是入侵检测系统&#xff08;Intrusion Detection System&#xff09;的缩写。它是一种安全技术&#xff0c;用于监视计算机网络或系统中的网络流量和活动&#xff0c;以识别潜在的恶意行为或入侵尝试。IDS可以通过分析网络数据包、审查日志…

selenium常用API的使用

目录 定位元素&#xff08;findElement&#xff09; CSS选择器定位 xpath选择器定位 CSS选择器和xpath选择器区别 操作测试对象 click&#xff1a;点击 sendKeys&#xff1a;输入文本框内容 clear&#xff1a;清除文本框内容 text&#xff1a;获取元素文本内容 …

一场大规模山体滑坡摧毁了世界最高峰之一

安纳普尔纳四号峰在喜马拉雅山山体滑坡中倒塌&#xff0c;科学家们终于弄清楚了它发生的时间和方式。 现今尼泊尔安纳普尔纳四号峰的景色&#xff0c;展示了中世纪时期倒塌的面貌。图片来源&#xff1a;Jrme Lav 山为什么不会永远生长&#xff1f;碰撞的构造板块不断地将山脉推…

4用opencv玩转图像2

opencv绘制文字和几何图形 黑色底图 显示是一张黑色图片 使用opencv画圆形 #画一个圆 cv2.circle(imgblack_img,center(400,400),radius100,color(0,0,255),thickness10) 画实心圆 只需要把thickness-1。 cv2.circle(imgblack_img,center(500,600),radius50,color(0,0,255),t…

Android LinearLayout dynamic add child ImageView,Glide load,kotlin

Android LinearLayout dynamic add child ImageView&#xff0c;Glide load&#xff0c;kotlin images.xml <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"andro…

uniapp微信小程序 401时重复弹出登录弹框问题

APP.vue 登陆成功后&#xff0c;保存登陆信息 if (res.code 200) {uni.setStorageSync(loginResult, res)uni.setStorageSync(token, res.token);uni.setStorageSync(login,false);uni.navigateTo({url: "/pages/learning/learning"}) }退出登录 toLogout: func…

Vulnhub: ColddWorld: Immersion靶机

kali&#xff1a;192.168.111.111 靶机&#xff1a;192.168.111.183 信息收集 端口扫描 nmap -A -sC -v -sV -T5 -p- --scripthttp-enum 192.168.111.183 查看login的源码发现提示&#xff1a;page和文件/var/carls.txt 漏洞利用 wfuzz探测account.php页面发现文件包含&am…

Xcode protobuf2.5添加arm64编译器补丁生成静态库

项目需求&#xff0c;protobuf源码编成静态库使用 但是&#xff0c;github上的protobuf源码没有对应arm64的编译器定义&#xff0c;编译出来的静态库使用时报错。 下面的连接是arm64编译器代码补丁包&#xff0c;把编译器代码放到src/google/protobuf/stubs/atomicops_intern…

【云原生】kubernetes中容器的资源限制

目录 1 metrics-server 2 指定内存请求和限制 3 指定 CPU 请求和限制 资源限制 在k8s中对于容器资源限制主要分为以下两类: 内存资源限制: 内存请求&#xff08;request&#xff09;和内存限制&#xff08;limit&#xff09;分配给一个容器。 我们保障容器拥有它请求数量的…