数据结构——单链表OJ题(上)

目录

一、移除链表元素

1.思路

2.注意

3.解题

二、反转链表

思路1:三指针翻转法

(1)注意

(2)解题

思路2:头插法

(1)注意

(2)解题

三、链表的中间结点

思路1:快慢指针法

(1)注意

(2)解题 

思路2:两次遍历法

(1)注意

(2)解题

四、返回倒数第k个结点

1.思路:快慢指针法

2.注意

3.解题

五、合并两个有序链表

1.思路

2.注意

3.解题

六、链表分割

1.思路

2.注意

3.解题

七、写在最后

 


一、移除链表元素

1.思路

创建一个新链表,用指针pcur遍历原链表,对每个结点的数据进行判断,如果等于val则不做处理,如果不相等则尾插到新链表中。

2.注意

(1)原链表可能为空,那么返回NULL;

(2)最后记得将newTail指向NULL,在此之前需要判断newTail不能为空,因为如果为空,不存在newTail->next。

3.解题

typedef struct ListNode ListNode;
struct ListNode*removeElements(ListNode* head , int val)
{if(head == NULL)//传入的该链表可能为空{return NULL;}//创建一个新链表ListNode* newHead = NULL;ListNode* newTail = NULL;//创建一个遍历该链表的指针ListNode* pcur = head;while(pcur){if(pcur->val != val){如果不等于val,尾插到新链表中if(newHead == NULL){newHead = newTail = pcur;}else{newTail->next = pcur;newTail = newTail->next;}}pcur = pcur->next;}//将尾结点指向NULLif(newTail){newTail->next = NULL;}return newHead;
}

二、反转链表

思路1:三指针翻转法

创建三个指针n1,n2,n3分别指向NULL、head和head->next,改变指向,将n2指向n1,进行循环遍历原链表。

(1)注意

①原链表可能为空,那么返回NULL;

②n1为反转链表的头结点。

(2)解题

typedef struct ListNode ListNode;
ListNode* reverseList(ListNode* head)
{if(head == NULL){return NULL;}ListNode *n1,*n2,*n3;n1 = NULL;n2 = head;n3 = head->next;while(n2){n2->next = n1;n1 = n2;n2 = n3;if(n3){n3 = n3->next;}}return n1;
}

思路2:头插法

创建新链表,通过pcur遍历原链表,将数据头插到原链表中,得到反转链表。

(1)注意

①创建新指针保存pcur的下一个结点,否则pcur无法找到原位置。

(2)解题

typedef struct ListNode ListNode;
struct ListNode* reverseList(struct ListNode* head)
{//新链表ListNode* newhead = NULL;ListNode* pcur = head;while(pcur){//保存当前结点的下一个结点ListNode* next = pcur->next;//头插新结点pcur->next = newhead;//更新头结点newhead = pcur;//移动到下一个结点pcur = next;}return newhead;
}

三、链表的中间结点

思路1:快慢指针法

初始时,快指针和慢指针都指向头结点。快指针一次经过两个结点,慢指针一次经过一个节点,当快指针走到链表结尾时,慢指针指向链表中间。

(1)注意

①分别分析一下链表长度为奇数和偶数时的情况(具体在代码中);

②最后返回指向链表中间的指针slow。

(2)解题 

typedef struct ListNode ListNode;
ListNode* middleNode(ListNode* head)
{ListNode* fast = head;ListNode* slow = head;while(fast && fast->next)//由于fast->next要取next,因此不能为空//且不能交换顺序:否则链表长度为偶数的情况不能实现{fast = fast->next->next;slow = slow->next;}return slow;
}

思路2:两次遍历法

第一次遍历得到链表的长度len,由此得到半个长度mid,第二次遍历得到中间结点。

(1)注意

①mid为len/2+1(len为int类型);

②在第二个while循环中,pcur初始为head,每进行一次循环pcur就指向下一个结点。因此,当mid写为len/2,那么在第二次循环中就顺利可实现。

(2)解题

typedef struct ListNode ListNode;
struct ListNode* middleNode(struct ListNode* head) 
{ListNode* pcur = head;int len = 0;//遍历得到链表的长度lenwhile(pcur){len++;pcur = pcur->next;}int mid = len / 2 ;//让pcur遍历链表,得到中间结点pcur = head;while(mid--){pcur = pcur->next;}return pcur;
}

四、返回倒数第k个结点

1.思路:快慢指针法

初始时,快指针和慢指针都指向头结点。快指针先走k步,然后快、慢指针同时走,当快指针走到链表末尾时,慢指针走到倒数第k个结点。

2.注意

①返回的是倒数第k个结点保存的数据,而非指针;

②若k大于链表长度,fast会为空,此时返回NULL。

3.解题

typedef struct ListNode ListNode;
int kthToLast(struct ListNode* head, int k)
{ListNode* fast = head;ListNode* slow = head;while(k--){if(fast){fast = fast->next;}else {return NULL;}}while(fast){fast = fast->next;slow = slow->next;}return slow->val;
}

五、合并两个有序链表

1.思路

创建两个指针分别遍历两个链表,比较两个指针指向结点存储的数据,创建新链表,将小的数据存储在新链表中。

2.注意

①使用malloc创建非空链表,在尾插数据时不再需要判断newHead是否为NULL,避免代码冗余;

②当n1和n2其中一个为空会跳出循环,说明遍历完成。此时需要将另外一个尾插到新链表中。

③不必再令newTail指向空,因为此时尾结点不是newTail,而是后续尾插的n1或n2。

3.解题

typedef struct ListNode ListNode;
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2)
{if(list1 == NULL){return list2;}if(list2 == NULL){return list1;}//创建新链表ListNode* newHead, *newTail;newHead = newTail = (ListNode*)malloc(sizeof(ListNode));ListNode* n1 = list1;ListNode* n2 = list2;while(n1 && n2){if(n1->val < n2->val){newTail->next = n1;newTail = newTail->next;n1 = n1->next;}else{newTail->next = n2;newTail = newTail->next;n2 = n2->next;}}if(n1){newTail->next = n1;}if(n2){newTail->next = n2;}ListNode* ret = newHead->next;free(newHead);newHead = NULL;return ret;
}

六、链表分割

1.思路

创建两个新链表(大于x和小于x的分别存储在两个链表中),用pcur遍历原链表,最后将大链表尾插在小链表后。

2.注意

①使用malloc创建两个非空链表,分别存储大于和小于x的数据。

3.解题

typedef struct ListNode ListNode;
ListNode* partition(ListNode* pHead, int x) {//大链表ListNode* greaterHead, *greaterTail;greaterHead = greaterTail = (ListNode*)malloc(sizeof(ListNode));//小链表ListNode* lessHead,*lessTail;lessHead = lessTail = (ListNode*)malloc(sizeof(ListNode));ListNode* pcur = pHead;while(pcur){if(pcur->val < x){lessTail->next = pcur;lessTail = lessTail->next;}else {greaterTail->next = pcur;greaterTail = greaterTail->next;}pcur = pcur->next;}lessTail->next = greaterHead->next;greaterTail->next = NULL;ListNode* ret = lessHead->next;free(lessHead);free(greaterHead);lessHead = greaterHead = NULL;return ret;}

七、写在最后

一起加油,敬请期待“单链表OJ题(下)”~

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

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

相关文章

目标检测算法:深入探索与前沿展望

大家好&#xff0c;我是一名测试开发工程师&#xff0c;已经开源一套【自动化测试框架】和【测试管理平台】&#xff0c;欢迎大家联系我&#xff0c;一起【分享测试知识&#xff0c;交流测试技术】 在人工智能的浩瀚星空中&#xff0c;目标检测算法无疑是一颗璀璨的明星&#x…

uniapp的h5,读取本地txt带标签的文件

效果图 使用的回显的标签是u-parse&#xff0c;下面的网址讲了这个标签的相关 https://www.cnblogs.com/huihuihero/p/12978903.html 导入此插件 https://ext.dcloud.net.cn/plugin?id364 使用 uni.request({// 本地文件url: "/static/互联网医院医师端用户协议.txt…

开始尝试从0写一个项目--前端(三)

器材管理板块 添加器材管理导航 src\views\home\Home.vue src\router\index.js src\views\equipment\Equipment.vue <template><div>hello!</div></template> 测试 搜索导航分页查询 src\views\equipment\Equipment.vue <template><div&…

51.TFT_LCD液晶屏驱动设计与验证(4)

&#xff08;1&#xff09;顶层文件&#xff1a; module tft_colorbar(input clk ,input reset_n ,output hsync ,output vsync ,output [23:0] rgb_tft ,output tft_bl ,output …

LeetCode算法——滑动窗口矩阵篇

1、长度最小的子数组 题目描述&#xff1a; 解法&#xff1a; 设一个 for 循环来改变指向窗口末尾的指针&#xff0c;再不断抛弃当前窗口内的首元素 最终确定满足条件的最小长度 class Solution { public:int minSubArrayLen(int target, vector<int>& nums) {int …

Python 教程(五):理解条件语句和循环结构

目录 专栏列表前言条件语句if 语句elif 语句else 语句示例 循环结构for 循环while 循环break 和 continue实例演示 循环控制语句range 函数enumerate 函数 模式匹配总结 在前四篇教程中&#xff0c;我们学习了 Python 的基本语法和数据结构。本篇教程&#xff0c;我们将深入探讨…

git sendemail使用

教程参考&#xff1a; git-send-email - 以电子邮件形式发送补丁集 1、安装git-email 2、配置 SMTP 服务器 git config --global sendemail.smtpserver smtp.163.com git config --global sendemail.smtpserverport 465 git config --global sendemail.smtpuser xxxxxx163.c…

【故障排查】Docker启动Nacos报错:No DataSource set 问题解决

Nacos报错内容 Nacos Server did not start because dumpservice bean construction failure : No DataSource set原因分析 Nacos 配置的是单机模式&#xff0c;使用mysql 进行存储配置文件&#xff0c;Nacos的启动脚本已经配置了MySQL的连接方式&#xff0c;根据错误提示&a…

大话成像公众号文章阅读学习(二)--- 下一代 AI-ISP会更好

系列文章目录 大话成像公众号文章阅读学习&#xff08;一&#xff09;---- 索尼Alpha 9 III 大话成像公众号文章阅读学习&#xff08;二&#xff09;— 下一代 AI-ISP会更好 文章目录 系列文章目录前言一、AI-ISP1.1 定义与工作原理1.2 应用场景 二、展望总结 前言 这篇是 下…

AWS-Lambda的使用

介绍 Lambda 是一种无服务器(Serverless), 而且设计成事件驱动的计算服务器. 简单来说, 你可以将你的 code 上传, 当有事件产生(例如cronjob , 或者S3有新的文件被上传上來) , 你的code 就会在瞬间(零点几秒以內)被叫起來执行. 由于你不用管 Server如何维护, 或者自动扩展之类…

【Android】安卓四大组件之广播知识总结

文章目录 动态注册使用BroadcastReceiver监听Intent广播注册Broadcast Receiver 静态注册自定义广播标准广播发送广播定义广播接收器注册广播接收器 有序广播修改发送方法定义第二个广播接收器注册广播接收器广播截断 使用本地广播实践-强制下线使用ActivityCollector管理所有活…

微信答题小程序产品研发-UI界面设计

高保真原型虽然已经很接近产品形态了&#xff0c;但毕竟还不能够直接交付给开发。这时就需要UI设计师依据之前的原型设计&#xff0c;进一步细化和实现界面的视觉元素&#xff0c;包括整体视觉风格、颜色、字体、图标、按钮以及交互细节优化等。 UI设计不仅关系到用户的直观感…

Scrapy 爬取旅游景点相关数据(四)

本节内容主要为&#xff1a; &#xff08;1&#xff09;创建数据库 &#xff08;2&#xff09;创建数据库表 &#xff08;3&#xff09;爬取数据进MYSQL库 1 新建数据库 使用MYSQL数据库存储数据&#xff0c;创建一个新的数据库 create database scrapy_demo;2 新建数据表 CR…

tensorflow2(快速入门)

版本问题 导包 import tensorflow as tf 加载数据 加载并准备 MNIST 数据集。将样本数据从整数转换为浮点数&#xff1a; mnist tf.keras.datasets.mnist (x_train, y_train), (x_test, y_test) mnist.load_data() x_train, x_test x_train / 255.0, x_test / 255.0 搭…

Redis:AOF持久化

1. 简介 以日志的形式来记录每个写操作&#xff0c;将redis执行的每个写操作记录下来&#xff08;读操作不记录&#xff09;&#xff0c;只需追加文件但不可以改写文件&#xff0c;redis启动之初会重新构建数据&#xff0c;即redis重启后会将日志中的所有写指令重新执行一遍以达…

WordPress主题追格企业官网主题免费开源版V1.1.6

追格企业官网主题免费开源版由追格开发的一款开源wordpress主题&#xff0c;专为企业建站和追格企业官网小程序&#xff08;开源版&#xff09;PC配套而设计&#xff0c;功能集新闻动态、留言反馈、产品与服务、公司简介、联系我们等模块。

Transformer,注意力机制。

&#x1f3c6;本文收录于《CSDN问答解惑-专业版》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收…

QT总结——图标显示坑

最近写代码遇到一个神仙大坑&#xff0c;我都怀疑我软件是不是坏了&#xff0c;这里记录一下。 写qt工程的时候我们一般会设置图标&#xff0c;这个图标是窗体的图标同时也是任务栏的图标&#xff0c;但是我发现生成的exe没有图标&#xff0c;这个时候就想着给他加一个图标&…

前端开发知识(一)-html

1.前端开发需掌握的内容&#xff1a; 2.前端开发的三剑客&#xff1a;html、css、javascript Vue可以简化JavaScpript流程。 Element&#xff08;饿了么开发的&#xff09; &#xff1a;前端组件库。 Ngix&#xff1a;前端服务器。 3.前端开发工具&#xff1a;vscode 1)按…

染色封锁问题

我们只要知道我们一个联通块中的点要么没有被河蟹占着&#xff0c;要么就要有河蟹&#xff0c;这不就是染色问题吗&#xff0c;我们只要取其中的最小值加到我们答案中就行&#xff0c;如果相邻的边颜色一样&#xff0c;就无解 #define _CRT_SECURE_NO_WARNINGS #include<bit…