链表常见题总结一

2023-11-20

     链表可以说是笔试面试的重点,因为写一个链表相关的题可以在短时间写出来,并且考验测试人的水平。特别将平时经常做的链表的题拿上来,做个小结。

   1. 求单链表中结点的个数
   2. 将单链表反转
   3. 查找单链表中的倒数第K个结点(k > 0)
   4. 查找单链表的中间结点
   5. 已知两个单链表pHead1 和pHead2 各自有序,把它们合并成一个链表依然有序
   6. 判断一个单链表中是否有环
   7. 判断两个单链表是否相交
  8. 求两个单链表相交的第一个节点
  9. 已知一个单链表中存在环,求进入环中的第一个节点
  10. 给出一单链表头指针pHead和一节点指针pToBeDeleted,O(1)时间复杂度删除节点pToBeDeleted

  1.求单链表节点的个数

//求单链表中结点的个数
int Length(ListNode *phead)
{
	int len = 0;
	while (phead != NULL)
	{
		len++;
		phead = phead->pnext;
	}
	return len;
}

   2.单链表反转

     我是按照递归和非递归做的
     
//单链表反转
ListNode* Reverse(ListNode *phead)
{
	if (phead == NULL||phead->pnext==NULL)
		return phead;
	ListNode *pre = new ListNode(0);
	ListNode *temp = pre;
	pre->pnext = phead;
	ListNode* cur = phead;
	ListNode* next = phead->pnext;
	while (next != NULL)
	{
		cur->pnext = pre;
		pre = cur;
		cur = next;
		next = next->pnext;
	}
	cur->pnext = pre;
	phead->pnext = NULL;
	delete temp;
	return cur;
}

//单链表反转,递归
ListNode* ReverseRecursion(ListNode* phead)
{
	if (phead == NULL || phead->pnext == NULL)
		return phead;
	ListNode *temp = phead->pnext;
	ListNode *newhead=ReverseRecursion(temp);   //先反转链表结点的后一个结点
	temp->pnext = phead;            //将该结点放在其原来后面结点的后一个结点
	phead->pnext = NULL;
	return newhead;
}

    3.倒数第K个节点

//查找单链表中的倒数第K个结点(K>0),采用双指针法
ListNode* TheKthListNode(ListNode* phead,int k)
{
	ListNode *fast = phead;
	int i = 0;
	while (i < k-1 && fast != NULL)
	{
		fast = fast->pnext;
		i++;
	}
	if (fast == NULL)
		return NULL;
	ListNode *slow = phead;
	while (fast->pnext != NULL)
	{
		slow = slow->pnext;
		fast = fast->pnext;
	}
	slow->pnext = NULL;
	return slow;
}

    4.查找单链表的中间节点

//找出单链表的中间结点,采用快慢指针
ListNode* MiddleNode(ListNode* phead)
{
	ListNode *slow = phead;
	ListNode *fast = phead;
	if (phead == NULL)
		return phead;
	while (fast->pnext != NULL)
	{
		fast = fast->pnext;
		slow = slow->pnext;
		if (fast->pnext != NULL)
			fast = fast->pnext;
	}
	return slow;
}

     5.合并两个有序的链表,使得结果仍然有序

//两链表各自有序,合并成一个链表依然有序
ListNode* Merge(ListNode *phead1, ListNode *phead2)
{
	if (phead1 == NULL)
		return phead1;
	if (phead2 == NULL)
		return phead2;
	ListNode *pre=new ListNode(0);
	ListNode *cur = pre;
	ListNode *temp = NULL;
	while (phead1 && phead2)
	{
		temp = phead1->val < phead2->val ? phead1 : phead2;
		cur->pnext = temp;
		cur = temp;
		if (temp == phead1)
			phead1 = phead1->pnext;
		else
			phead2 = phead2->pnext;
	}
	while (phead1)
	{
		cur->pnext = phead1;
		cur = cur->pnext;
		phead1 = phead1->pnext;
	}
	while (phead2)
	{
		cur->pnext = phead2;
		cur = cur->pnext;
		phead2 = phead2->pnext;
	}
	cur->pnext = NULL;
	temp = pre->pnext;
	delete pre;
	return temp;
}

     6.判断单链表是否有环

//判断一个单链表是否有环,同样采用快慢指针,要是他们重合就有环
bool IsCircle(ListNode *phead)
{

	ListNode *fast = phead;
	ListNode *slow = phead;
	while (fast!=NULL && fast->pnext!=NULL)
	{
		fast = fast->pnext->pnext;
		slow = slow->pnext;
		if (fast == slow)
			return true;
	}
	return false;
}

     7.判断两个单链表是否相交

//判断两个单链表是否相交,若相交,则两个链表的最后一个节点必定相同,否则不相交
bool IsConnect(ListNode *phead1, ListNode *phead2)
{
	if (phead1 == NULL || phead2 == NULL)
	{
		return false;
	}
	while (phead1->pnext != NULL)
	{
		phead1 = phead1->pnext;
	}
	while (phead2->pnext != NULL)
	{
		phead2 = phead2->pnext;
	}
	if (phead1 == phead2)
		return true;
	else
		return false;
}

     8.求两个链表相交的第一个节点

//求两个单链表相交的第一个节点,先分别计算两个链表的长度,再让长的链表先走超出的那部分,然后两个链表步调相同
ListNode* TheFirstConnectNode(ListNode *phead1, ListNode *phead2)
{
	if (phead1 == NULL || phead2 == NULL)
	{
		return NULL;
	}
	ListNode *temp1 = phead1;
	ListNode *temp2 = phead2;
	int len1 = 0, len2 = 0;
	while (temp1->pnext != NULL)
	{
		len1++;
		temp1 = temp1->pnext;
	}
	while (temp2->pnext != NULL)
	{
		len2++;
		temp2 = temp2->pnext;
	}
	if (temp1 != temp2)
		return NULL;
	else
	{
		if (len1 > len2)
		{
			temp1 = phead1;
			for (int i = 0; i < len1 - len2;i++)
			{
				temp1 = temp1->pnext;
			}
			temp2 = phead2;
		}
		else
		{
			temp2 = phead2;
			for (int i = 0; i < len2 - len1; i++)
			{
				temp2 = temp2->pnext;
			}
			temp1 = phead1;
		}
		while (temp1 != temp2)
		{
			temp1 = temp1->pnext;
			temp2 = temp2->pnext;
		}
		return temp1;
	}
}

     9.已知单链表有环,求进入环中的第一个节点

//已知单链表有环,求进入环中的第一个节点
ListNode *TheFirstCircleNode(ListNode *phead)
{
	//先找一个在环中的节点,采用快慢指针
	ListNode *fast = phead->pnext->pnext;
	ListNode *slow = phead->pnext;
	while (fast != slow)
	{
		slow = slow->pnext;
		fast = fast->pnext->pnext;
	}
	//计算环的长度
	int len = 1;
	fast = fast->pnext;
	while (fast!=slow)
	{
		len++;
		fast = fast->pnext;
	}
	//让一个快指针先走len,然后慢指针开始走,当两个第一次相遇点就是环的第一个节点
	fast = phead;
	slow = phead;
	for (int i = 0; i < len; i++)
	{
		fast = fast->pnext;
	}
	while (fast != slow)
	{
		fast = fast->pnext;
		slow = slow->pnext;
	}
	slow->pnext = NULL; //此处只是为了提炼一个节点出来,免得打印的时候因为是循环,打印循环输出一满屏
	return slow;
}

    10.删除一个指定节点,时间复杂度为O(1)

//给出一单链表头指针和一节点指针toBeDel,O(1)时间复杂度删除节点toBeDel
void DelOneNode(ListNode *phead, ListNode *toBeDel)
{
	if (toBeDel->pnext == NULL)
	{
		toBeDel = NULL;
	}
	toBeDel->val = toBeDel->pnext->val;      //O(1)时间复杂度的话只能将后面节点的值赋给该结点,在将
	toBeDel->pnext = toBeDel->pnext->pnext;  //要删除的节点的后一个节点删除;
}
文中均为自己写的代码,均通过自己写的简单的测试,但是肯定还有些测试不能通过,希望有人找出错误给我纠正一下,不胜感谢。待更新ing..

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

链表常见题总结一 的相关文章

  • win可以上网,但是右下方显示“无internet链接“

    使用了下面链接的方法 成功解决 Win10可以联网但右下角显示无法连接到Internet怎办 首先 打开控制面板 control 右上角 将查看方式切换为小图标 调整计算机的设置下 找到并点击网络和共享中心 网络和共享中心窗口 左侧点击更改
  • 苹果鼠标win10不能滑动_解决WIN10使用苹果鼠标滚轮不能使用的问题

    这个花费了蛮多时间却解决不了 网上流行各种各样的尝试 还有很多的安装包 都试了一遍 无一解决 绝望的时候 看到有个网友发的云盘链接 感谢 花小柏 一安装即可使用 太感谢了 最后也分享给大家 链接 https pan baidu com s
  • Linux运维脚本

    20200911 这里记录一些平时使用的脚本 免密登陆什么的 免密登陆 bin bash f root ssh id rsa pub ssh keygen t rsa P f root ssh id rsa gt dev null expe
  • 【2023版】最新stable diffusion安装教程,一键安装,永久使用,stable diffusion下载安装教程!

    关于现在非常红火的AI绘画 很多感兴趣的人不知道如何入手 如果你的电脑配置足够好 那么不要犹豫 让我来教你如何在本地电脑全免费运行当下最强大的AI绘画工具 Stable Diffusion 吧 一 Stable Diffusion 是什么
  • cmake Targets:CMake如何构建简单的Target

    CMake有三个基本命令 用于定义CMake Target 分别是 add executable 构建exe add library 构建库 add custom target 自定义构建目标在camke构建阶段运行的 add execut
  • go 进阶 go-zero相关: 七. 拦截器与熔断拦截器

    目录 一 拦截器的基础使用 1 服务端拦截器 2 客户端拦截器 二 拦截器底层底层执行原理 三 go zero默认添加的拦截器 客户端 1 熔断器拦截器 BreakerInterceptor 服务端 一 拦截器的基础使用 在go zero
  • 设计模式-享元模式

    一 概念 如果在一个系统中存在多个相同的对象 那么只需要共享一份对象的拷贝 而不必为每一次使用都创建新的对象 目的是提高系统性能 上面的概念乍一听好像单例模式其实不是 单例模式只保存一个对象 但是这里可以有很多个不同对象 但是每个对象只有一
  • ChatGPT火了,将给网络安全行业带来什么影响?

    ChatGPT是一个基于人工智能的聊天机器人 它是使用OpenAI的GPT技术构建的 能够根据用户输入的语言自动生成响应 ChatGPT可以回答各种问题 提供建议和支持 以及进行闲聊和娱乐等 它旨在为用户提供一个方便 快捷 智能的交互方式
  • 蓝桥杯-稍大的字符串

    题目 标题 稍大的串 串可以按照字典序进行比较 例如 abcd 小于 abdc 如果给定一个串 打乱组成它的字母 重新排列 可以得到许多不同的串 在这些不同的串中 有一个串刚好给定的串稍微大一些 科学地说 它是大于已知串的所有串中最小的串
  • filter函数的用法_动态数组函数系列5

    FILTER函数是筛选函数 就是在源数据中按照我们的条件筛选出我们想要的数据 除了常规的数据筛选 还可以进行多条件的 且 或者 或 的筛选 下面我们来看看这个FILTER函数怎么用 如果不想看文字 直接拉到最后看视频吧 FILTER函数语法
  • 属性,服务,事件

    属性 即设备支持的可读和 或可设置的参数功能 以一个灯为例 灯的开关就可以定义为一个属性 用户可以读取该属性的当前数值来得知灯的开关状态 也可以通过对该属性进行设置来打开或者关闭这个灯 服务 如果设备的某个功能只能设置 不能获取 那么可以将
  • 微服务系统硬件要求_全面解析微服务系统监控分层,啃透服务治理核心!

    架构师 JiaGouX 我们都是架构师 架构未来 你来不来 前言 监控 是微服务治理的一个重要环节 监控系统的完善程度直接影响到我们微服务质量的好坏 我们的微服务在线上运行时 有没有一套完善的监控体系能去了解到它的健康情况 这对整个系统的可
  • 【NPS 服务器搭建】2. 客户端完全手册

    场景 内网机器需要提供远程访问 如SSH 环境 1 一台独立ip的VPS 如阿里云服务器 2 一台内网的主机 windows linux 步骤 1 服务端中 新建客户端 2 服务端中 新建通道 2 1 点击进入通道管理 2 2 新增通道 1
  • ruoyi框架源码阅读之--redis配置

    redis配置 文章目录 redis配置 前言 一 引入依赖 二 配置信息 三 序列化文件 四 redis配置文件 五 redis工具类 六 redis接口限流 注解实现 七 redis接口限流 注解代码 总结 前言 redis的配置信息

随机推荐

  • Java中count++的坑

    最近做了一道题 非常容易落入陷阱 当count初始值为0 count count 和count count 运行出来的结果是不一样的 count count 运行出来的结果依旧为0 这是因为JVM运行时 会把count变量拷贝到到临时变量区
  • mongos、nanomsg、zeroMQ简述和go-mongos使用实例

    mongos nanomsg zeroMQ简述和go mongos使用实例 文章目录 mongos nanomsg zeroMQ简述和go mongos使用实例 1 mongos nanomsg简述 2 zeroMQ nanomsg和可扩展
  • dac解码芯片天梯_【关于AK4499引发的思考】选DAC,解码芯片追新有没有必要?

    春风不度玉门关 又见才子伴乐谈 标题这个问题 其实是差不多一年前有人在微博上问我的 彼时是2018年的年底 AKM宣布了其新款旗舰解码芯片AK4499诞生的消息 吸引了玩家群体不小的关注 于是便有人问我 对于准备购置或者更换解码的玩家来说
  • 老年人教程,使用N2N进行异地组网

    一 简介 1 为什么用N2N 在一般情况下 两台机器如果是处在同一个局域网下 那么这两台机器可以通过各自的内网IP进行通信 但是 在某些情况下你可能希望两个不同局域网的机器进行通信 此时 N2N 就能给我们带来一个简单快捷的解决方案 N2N
  • Applovin股价飞涨,同场竞技的汇量或将拿到相同剧本

    全球化 跨行业投资是对冲投资风险 实现超额收益的重要方式 若论什么行业在全球化投资中入门最简单 那一定是互联网 APP 游戏人人都能接触 轻松解决了对商业门槛的理解问题 所有的增长价值一清二楚 但互联网作为一个看起来非常成熟的行业 留给外界
  • visual studio:给项目添加宏定义

    插眼 参考 https blog csdn net lucky fly article details 103321220
  • 浅谈Java Enum作用与应用场景

    在实际应用中 有的变量只有几种可能取值 如人的性别只有两种可能取值 星期只有七种可能取值 在 Java语言中对这样取值比较特殊的变量可以定义为枚举类型 所谓枚举是指将变量的值一一列举出来 变量只限于列举出来的值的范围内取值 枚举是一个特殊的
  • python 列表sort函数和sorted函数应用————实现c++ sort按不同关键字排序功能

    首先基本的应用请参考其它教程 百度很多 现有列表ll 1 2 4 5 8 9 1 1 4 3 8 20 要实现排序 排序规则为 按元组第一个元素降序 如果元祖第一个元素相同按元祖第二个元祖升序 import functools def tc
  • 以太坊执行miner.start返回null( 转载)

    博文地址 http blog csdn net wo541075754 article details 78735711
  • redis之expire命令详解

    expire是设置redis过期时间的命令 需要注意的点有以下几点 expire设置过期时间的单位是秒 如设置name的过期时间为1000秒 expire name 1000 超过时间后会自动删除key 但是不一定是立即删除 因为redis
  • el-select下拉弹窗样式修改

    首先在el select上定义 popper class eloption 和 popper append to body true 使用方法如下面代码段
  • CAN总线隔离器简介

    简介 LCAN OptoAdapter是一款通用插入式电隔离适配器 完全的硬件逻辑设计 可安装在CAN网络的任何位置 快速实现CAN网络之间电隔离 独有的CAN信号调理技术 可以实现改变CAN网络拓扑结构 长支线 增加节点数目等功能 独有的
  • Qt之Q_GLOBAL_STATIC创建全局静态对象

    概述 所谓的全局静态对象 大多是在单例类中所见 之前写过一篇文章介绍如何实现一个单例类 在这里 这是最常见的方式来进行创建 需要自定义 static 类对象 并进行手动初始化 而今天要说的是更简单的方式来实现 Qt 提供了一个非常方便的宏Q
  • Android Bootchart使用

    目录 1 bootchart简介 2 bootchart 在 android 平台的使用步骤 复杂方式 old 3 bootchart 在 android 平台的使用步骤 方便方式 new 4 修改bootchart抓取的停止时间 5 可能
  • 树莓派4串口配置及使用

    文章目录 改变串口的功能 使能串口 重启树莓派 安装minicom 使用minicom通信 编写连接树莓派的代码 打开串口代码 配置串口代码 关闭串口代码 读写串口 改变串口的功能 sudo nano boot cmdline txt 删除
  • intellij-idea每次都需要source bash_profile

    windows用户 为了提高效率我们在 bash profile文件中配置了简写命令 然后我们在JetBrains产品中使用的terminnal终端是git bash 发现每次重新启动JetBrains后都需要执行一下 source bas
  • Unity3D:按键生成物件,Instantia…

    在按下按键之后 可以在画面中生成之前定义好了的物体 这里使用了Instantiate函数来生成 1 先在游戏中定一个空物件GameObject 创建空物件快捷键 ctrl shift n 2 在视图中放置 3 编写脚本 脚本 SpaceCh
  • Ubuntu设置共享文件夹(解决/mnt 目录下没有 hgfs 目录)

    目录 1 Windows创建一个共享文件夹 2 在虚拟机的设置中选择Windows下的共享文件夹 3 在Ubuntu中查看共享文件夹 4 解决 mnt 目录下没有 hgfs 目录 5 设置共享文件夹以后 mnt hgfs下没有出现共享文件夹
  • 2022 ICML 论文合集(附Code和数据集)

    1 Sharp MAML Sharpness Aware Model Agnostic Meta Learning Task 元学习 代码链接 https github com mominabbass sharp maml 数据集 http
  • 链表常见题总结一

    链表可以说是笔试面试的重点 因为写一个链表相关的题可以在短时间写出来 并且考验测试人的水平 特别将平时经常做的链表的题拿上来 做个小结 1 求单链表中结点的个数 2 将单链表反转 3 查找单链表中的倒数第K个结点 k gt 0 4 查找单链