数据结构----链表算法题目

1.移除链表的元素

这个题目我们有多种解决方案

(1)思路A:遍历整串数据,如果是我们想要删除的数据,就让这个数字后面的数字全部向前移动直到整传数字全部遍历完成;这个方法的时间复杂度是N的平方;

(2)思路B:时间复杂度的优化:我们新建一个数组temp,在原来的数组里面找到不是val的数字,放到temp数组里面,最后把temp数组赋值给原来的数组,这样时间复杂度就是两次遍历,即2N,因为在计算时间复杂度的时候,常数是忽略的,因此这个时间复杂度就是O(N),这个做法就是拿空间换取时间;(代码的解法就是这个)

(3)思路C:这个做法就是利用两个指针的移动,分别定义两个指针src和dest指针,我们让开始的时候2个指针都指向我们的第一个数据,然后是src不断地向后移动,如果src指向的数据是val就跳过,不是val就让src指向的值赋值给dest,这个时候两个指针都要进行向后移动一位,最后我们可以发现当这个时候的dest前面的所有数据正好是我们想要的;这个时候相当于只遍历了一次,时间复杂度就是O(N),这个是正经的N,思路B是2N简化的N,因此,这个解法的效率是最高的;

(1)我们自己先是利用typedef对结构体重新定义;

(2)定义了一个pcur指针,指向的是链表的头部,接下来进行遍历,如果我们遍历到的数据和val不相同就会进入循环,循环里面分为两种情况,链表是空的和链表不是空的,链表是空的话,就直接把我们pcur指向链表的头部和尾部(这里的头部就是尾部);

(3)如果链表不是空的话就需要一个一个地进行遍历,因为我们的符合条件的要放在一个新的链表里面,而且是尾插到新的链表里面去;

(4)当我们全部全部遍历完之后,如果最后的一个元素是val,就需要把前面的一个节点的next设置为空指针,否则她还是能找到下一个元素的;

2.反转链表

(1)我们可以有多种方法解决这个问题,例如我们可以新建链表把1取出来,作为一个头结点,再把2取出来,在链表里面进行头插,依次进行下去,我们就可以解决这个链表的反转问题;

(2)我们这里提供的方法是设置3个指针,对链表进行处理,n1,n2,n3这三个指针,n1指向的是空指针,n2指向的是链表的头部,n3指向的是链表的第二个位置,我们进行的操作就是对链表进行:把2的指针指向1,这个时候把n1挪到n2的位置,n2挪到n3的位置,n3挪到自己的下一个节点的位置,我们循环往复进行这样的操作,但是到链表的最后一个结点的时候,n1指向倒数第二个元素,n2指向最后的一个元素,n3指向的就是空位置,这个时候我们无法对n3进行n3=n3->next的操作,因此我们进行判断n3本身是否是空的,是空的我们在进行n3=n3->next的操作。

3.链表的中间节点

(1)这里提供两种方案,第一种就是遍历整个链表,然后进行计数,我们得到的count就是链表里面的结点的全部个数,我们使用count/2作为我们想要查找的元素的下标;

(2)我们这个代码利用的是快慢指针的思路:我们首先介绍一下:快慢指针就是说快指针是一次向后移动两个节点,慢指针就是一次跳过一个节点,当我们的fast指向的是空(奇数个节点),或者是fast->next指向空(偶数个节点),我们就找到了,slow指向的位置就是我们的中间节点;读者可以自行画图尝试;

(3)我们这里要特别说明一下,while循环里面的判断条件,fasr&&fast->next不能是空的,这两个判断的条件是不能换的,如果是偶数个节点,我们写作fast->next&&fast(这个写法是错误的),我们的偶数个节点,最后的fast->next相当于是对空指针解引用,这个时候的话程序一定会报错;但是我们如果先进行判断fast如果是空的话就会直接跳出循环,因为是&&连接符,就不会进行右边的判断了,这个时候是不会报错的。

4.合并两个有序的链表

(1)我们要首先进行创建两个新的链表;进行判空,如果一个是空的,直接返回另外的一个链表就行了;

(2)我们进行定义两个指针,分别指向两个链表的的头部,当两个链表都没有遍历完成的时候,进入循环,循环里面就是让li,l2指针指向的链表里面的元素进行比较,小的元素添加到新的链表的尾部,只要有一个遍历完成就会跳出循环,剩下的那个没有遍历完成的直接追加到新链表的后面

(3)另外的解法:上面的解法判断的时候,是重复的,我们优化一下解决方案:因为我们上面的做法是创建了两个新的链表之后就把头和尾全部设置为NULL,因此可能会出现为空的链表的情况,我们下面的解法不让他为空:

(4)具体如何做呢:我们使用动态内存管理函数malloc开辟空间,这个时候头部的节点和尾部的节点就指向了确定的地址(可能我们暂时不知道),但是这个时候就不可能是空的,我们不需要进行判断了,这个新开辟的链表长这个样子:

(5)这个时候,头尾指针指向了有效的地址,我们把链表的数据插入到2个之间;我们动态开辟的内存要进行释放,释放之后我们就找不到需要返回的头结点了,因此我们定义了一个临时变量ret把头节点后面的那个地址存起来(因为头节点是我们开辟空间的时候编译器加的,我们的链表数据是从第二个位置开始的),我们释放之后置空,返回这个的第二个位置的地址(也就是我们定义的临时变量ret);后面我们会学到,这个头部节点叫做哨兵位,这种链表叫做带头链表。

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

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

相关文章

ARM作业day8

温湿度数据采集应用: 由上图可知: 控制温湿度采集模块的引脚是PF14(串行时钟线)和PF15(串行数据线):控制温湿度采集模块的总线是AHB4,通过GPIOF串口和RCC使能完成初始化操作。 控制…

MAC-OS低版本升级到高版本——亲测有效

关于MAC-OS 10.13.6 升级到10.15的实战 一.MAC 欧司如何查看他的系统版本 查看信息如图 二.,去官网下载新的MAC OS 系统 官网地址:如何下载和安装 macOS - 官方 Apple 支持 (中国) 三.点击安装 四.具体步骤可以参考官网 在兼容的 Mac 电脑上下载并安装最新或以前…

最新版idea 合并分支方法

前言 以下是最新版的idea2024,如果有人找不到按键可能是因为版本不同。 操作步骤 看右小角我的分支是submit,现在我要将test合并到我的submit分支上 找到test分支,选择update,这一步会拉取相应分支内容等同于pull 选择merge 选…

I2C,UART,SPI(STM32、51单片机)

目录 基本理论知识: 并行通信/串行通信: 异步通信/同步通信: 半双工通信/全双工通信: UART串口: I2C串口: SPI串口: I2C在单片机中的应用: 软件模拟: 51单片机:…

PHP-file_get_contents(练习1)

[题目信息]: 题目名称题目难度PHP-file_get_contents(练习1)1 [题目考点]: file_get_contents() 把整个文件读入一个字符串中。 该函数是用于把文件的内容读入到一个字符串中的首选方法。如果服务器操作系统支持,还会使用内存映射技术来增…

同城O2O系统开发实战:外卖送餐APP的技术架构与实现

今天,我们将深入探讨同城O2O系统开发实战中,外卖送餐APP的技术架构与实现。 一、概述 外卖送餐APP是一种典型的O2O应用,通过移动互联网技术,将用户与商家连接起来,实现用户在线订餐,商家配送服务的模式。…

Git分布式版本控制系统——在IDEA中使用Git(一)

一、在IDEA中配置Git 本质上还是使用的本地安装的Git软件,所以需要在IDEA中配置Git 打开IDEA的设置页面,按照下图操作 二、在IDEA中使用Git获取仓库 1、本地初始化仓库 2、从远程仓库克隆 方法一: 方法二: 三、.gitignore文件…

简单的网站-表白墙(前后端交互)

提交信息后,就得到了下面的一行话 但是存在一些问题 在一个网站中,服务器起到的最主要的效果,就是 “存储数据” 因此服务器这边往往也就需要能够提供两种风格的接口。存数据 、取数据 二、实现前后端交互 1)先规定此处请求和响…

2024-04-11最新dubbo+zookeeper下载安装,DEMO展示

dubbozookeeper下载安装 下载zookeeper: 下载地址 解压,并进入bin目录,启动 如果闪退可以编辑脚本,在指定位置加上暂停脚本 报错内容说没有conf/zoo.cfg,就复制zoo_sample.cfg重命名为zoo.cfg 再次启动脚本&#x…

前端网络 --- http缓存

什么是http缓存? 1、HTTP 缓存会存储与请求关联的响应,并将存储的响应复用于后续请求。 2、缓存的原理是在首次请求后保存一份请求资源的响应副本,当用户再次发起相同请求时,判断缓存是否命中,如果命中则将前面的响应…

react v18 项目初始化

按照以下命令进行傻瓜式操作即可: 全局安装脚手架工具: npm install -g create-react-app创建项目my-react-app: create-react-app my-react-app安装 antd: yarn add antd安装 react-router-dom: yarn add react-router-dom启动项…

图论学习总结

目录 图论学习总结前言一、基础知识图的存储图的遍历 二、最短路多源最短路 F l o y d Floyd Floyd​ 算法例题及变形 e g 1 : S o r t i n g I t A l l O u t eg1:Sorting\ It\ All\ Out eg1:Sorting It All Out ( 蓝书例题,传递…

软硬链接与动静态库

文章目录 1.软硬链接2.动态库和静态库2.1 见一见库2.2 动静态库2.2.1 静态库2.2.2 动态库 2.3 动静态库的对比 3.真实的应用场景(ncurses库)4.库加载---可执行程序和地址空间4.1可执行程序的加载4.2 库的加载 1.软硬链接 2.动态库和静态库 2.1 见一见库 我们用过很多库。C/C的…

如何节约上架时间,小程序管理平台推荐

继微信正式推出微信小程序后,各个大厂陆续发布了各自的小程序平台 —— 支付宝小程序、百度小程序、头条小程序,各家不同的小程序标准一度让开发者们激情开骂,虽然目前跨平台的小程序开发可以通过taro、mpvue、kbone等跨平台开发框架来解决&a…

车载摄像头智能颜色校正解决方案,卓越画质新体验

随着智能交通和自动驾驶技术的快速发展,车载摄像头作为车辆感知外界环境的重要部件,其画面质量对于行车安全和用户体验至关重要。然而,由于光线变化、设备差异以及拍摄环境复杂多变,车载摄像头拍摄的画面往往会出现颜色失真、对比…

管理 nodejs 版本工具 nvm

nvm 方便切换不同版本的 node 及 对应的 npm 版本 一、安装nvm nvm官网 &#xff08;内含下载的文件&#xff0c;点击进去下载&#xff0c;并按照 网站文档步骤 操作即可&#xff09; 二、nvm 基础命令 nvm arch&#xff1a;显示node是运行在32位还是64位。nvm install <…

32.5k star!发现一个新的 API 调试工具!postman 要被替换了【文末有项目源码】

在软件开发过程中&#xff0c;API&#xff08;应用程序接口&#xff09;扮演着至关重要的角色。为了确保 API 的可靠性和性能&#xff0c;开发人员需要一种高效的方式来测试和调试它们。这方面的工具&#xff0c;大家经常用到的应该就是 postman 了。不过&#xff0c;今天想要给…

[Qt网络编程]之获取基本网络信息

前言 获取主机的网络地址和接口信息是进行网络编程的第一步&#xff0c;也是网络编程的基础。Qt提供了网络接口类 QNetworkInterface、网络地址人口类 QNetworkAddressEntry 和主机地址类 QHostAddress 来获取和使用地址信息。其中网络接口类 QNetworkInterface 描述了主机的卫…

短信防刷之滑动验证码

前言&#xff1a;最近想写一个滑动验证码&#xff0c;前台的样式虽然很好看&#xff0c;但是并不安全&#xff0c;网上也都是一些demo&#xff0c;不是前后台分离的&#xff0c;然后就自己查资料&#xff0c;自己来完成了 滑动验证码 一、为什么要使用滑动验证码 首先&#x…

斯坦福大学2024年人工智能发展和前景全面分析报告

2024 年指数是斯坦福大学迄今为止最全面的指数&#xff0c;恰逢人工智能对社会的影响力达到前所未有的重要时刻。今年&#xff0c;斯坦福大学扩大了研究范围&#xff0c;更广泛地涵盖人工智能的技术进步、公众对该技术的看法以及围绕其发展的地缘政治动态等基本趋势。 完整详细…