数据结构链表2(常考习题1)(C语言)

news2025/1/21 2:57:13

移除链表元素:

. - 力扣(LeetCode)

题目:

给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。

解题思路:

情况1:

情况2:

情况3:

我们以第一种情况写代码:

ListNode* removeElements(ListNode* head, int val)
{
	ListNode* cur = head;
	ListNode* slow = head;
	while (cur)
	{
		if (cur->val == val)
		{
			ListNode* tmp = cur->next;
			free(cur);
			cur = tmp;
			slow->next = cur;
		}
		else
		{
			slow = cur;
			cur = cur->next;
		}
	}
}

以第二、三种特殊情况改代码:

如果第一次就要删除头:

struct ListNode* removeElements(struct ListNode* head, int val)
{
	struct ListNode* cur = head;
	struct ListNode* tmp = NULL;
	struct ListNode* slow = head;
	while (cur)
	{
		if (cur->val == val)
	    {
			tmp = cur->next;
            if(head->val == val)
            {
                free(cur);
                cur = tmp;
                head = cur;
                slow = head;
            }
            else
            {
			free(cur);
			cur = tmp;
            slow->next = cur;
            }
		}
		else
        {
            slow = cur;
			cur = cur->next;
        }
	}
	return head;
}

反转链表:

. - 力扣(LeetCode)

题目:


给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。

解题思路:

考虑特殊:

只有一个元素:

同样适用!! 

        双指针解题,一个前驱指针,一个指向head的指针,还有一个临时变量next为了记录head的next的值。

具体代码如下:

ListNode* reverseList(ListNode* head)
{
	ListNode* cur = head;
	ListNode* slow = NULL;
	ListNode* next = NULL;
	while (cur)
	{
		next = cur->next;
		cur->next = slow;
		slow = cur;
		cur = next;
	}
}

链表的中间节点:

. - 力扣(LeetCode)

题目:

        给你单链表的头结点 head ,请你找出并返回链表的中间结点。

        如果有两个中间结点,则返回第二个中间结点。

解题思路:

        利用快慢指针,有四种情况,如图所示:

第一种,链表个数为偶数时:

第二种,链表个数为奇数时:

第三种,链表个数为1个时:

第四种,链表个数为2个时:

综上:

得出结论:
1、当链表个数大于2时,且为偶数时:

当快指针的next走到NULL时,慢指针所在的地方就是中间结点的地方。

2、当链表个数大于2时,且为奇数时:

当快指针走到NULL时,慢指针所在的地方就是中间节点的地方。

3、当链表个数等于1时:

快指针和慢指针不需要走。

4、当链表个数为2时:

和情况一是一样的。

综上:

也就是快指针分两种情况:

第一种就是快指针自身到达NULL时,第二种就是快指针的next到达NULL时。

不论是那种情况,最终都返回慢指针!!

代码如下:

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

合并两个有序链表:

. - 力扣(LeetCode)

题目:

将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 

解题思路:

        两个链表,每个链表都有一个可以移动的指针,接着让一个指针移动,每移一步让两个指针指向的值做对比,小的移下来,然后让新链表的指针和刚刚移动过的俩把表指针往后走一步。

        直到其中一个链表的指针指向空之后,将另一个链表的剩下部分整体移过去!

画图很重要!!!

特殊考虑:

        如果其中一个链表为空,可以指直接返回另一个链表的地址!

代码如下:

画图很重要!!!!!!

struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2)
{
 	struct ListNode* cur1 = list1;
	struct ListNode* cur2 = list2;
	struct ListNode* newhead = NULL;
	struct ListNode* tmp = NULL;
	if (cur1 == NULL)
	{
		return cur2;
	}
	else if(cur2 == NULL)
	{
		return cur1;
	}
	while (cur1 && cur2)
	{
		if (cur1->val > cur2->val)
		{
			if (newhead == NULL)
			{
				newhead = tmp = cur2;
			}
			else
			{
				tmp->next = cur2;
				tmp = tmp->next;
			}
			cur2 = cur2->next;
		}
		else
		{
			if (newhead == NULL)
			{
				newhead = tmp = cur1;
			}
			else
			{
				tmp->next = cur1;
				tmp = tmp->next;
			}
			cur1 = cur1->next;
		}
	}
	if (cur1 == NULL)
	{
		tmp->next = cur2;
	}
	else
	{
		tmp->next = cur1;
	}
	return newhead;   
}

链表分割:

链表分割_牛客题霸_牛客网

题目:

        现有一链表的头指针 ListNode* pHead,给一定值x,编写一段代码将所有小于x的结点排在其余结点之前,且不能改变原来的数据顺序,返回重新排列后的链表的头指针。

解题思路:

        将比x大的和比x小的首先区分开,最后再将其合并在一起!!

注意:最后比x大的后面需要手动在末尾添加NULL指针!


考虑特殊:

        如果链表中没有比x大的数,或者没有比x小的数,此时直接返回原链表的地址!!

代码如下:
 

ListNode* partition(ListNode* pHead, int x) 
{
	ListNode* cur = pHead;
	ListNode* newhead1 = NULL;
	ListNode* tmp1 = NULL;
	ListNode* newhead2 = NULL;
	ListNode* tmp2 = NULL;
	while (cur)
	{
		if (cur->val > x)
		{
			if (newhead1 == NULL)
			{
				newhead1 = tmp1 = cur;
			}
			else
			{
				tmp1->next = cur;
				tmp1 = tmp1->next;
			}
		}
		else
		{
			if (newhead2 == NULL)
			{
				newhead2 = tmp2 = cur;
			}
			else
			{
				tmp2->next = cur;
				tmp2 = tmp2->next;
			}
		}
		cur = cur->next;
	}
	if (!(newhead1 && newhead2))
	{
		return pHead;
	}
	tmp1->next = NULL;
	tmp2->next = newhead1;
	return newhead2;
}

链表的回文结构:

链表的回文结构_牛客题霸_牛客网

题目:

对于一个链表,请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法,判断其是否为回文结构。

给定一个链表的头指针A,请返回一个bool值,代表其是否为回文结构。保证链表长度小于等于900。

测试样例:

1->2->2->1
返回:true

解题思路:

        文字叙述:


        只需要将该链表进行反转后,然后两个链表进行遍历,如果中途有不一样的值就输出fasle

如果遍历结束后,两个指针都指向NULL,返回true,就可以说明该链表是回文结构。

具体代码:
        

     ListNode* Reverse(ListNode*head)//链表反转代码
{
	ListNode* cur = head;
	ListNode* slow = NULL;
	while (cur)
	{
		ListNode* tmp = cur->next;
		cur->next = slow;
		slow = cur;
		cur = tmp;
	}
	return slow;
}


    bool chkPalindrome(ListNode* pHead) //判断回文代码
    {
    ListNode* cur = pHead;
	ListNode* newhead = NULL;
	newhead = Reverse(cur);
	while (cur&&newhead)
	{
        if(cur->val != newhead->val)
        {
            return false;
        }
        cur = cur->next;
		newhead = newhead->next;
	}
        return true;
        // write code here
    }

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

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

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

相关文章

【vluhub】skywalking

SkyWalking是一个开源监控平台,用于从服务和云原生基础设施收集、分析、聚合和可视化数据 低版本存在sql注入漏洞 访问地址 http://192.168.203.12:8080/graphql burpsuite抓数据包 替换 {"query":"query queryLogs($condition: LogQueryConditi…

安装STM32开发工具:STM32CubeMX、STM32CubeIDE、STM32CubeCLT

ST官网地址:https://www.st.com/content/st_com/en.html ST官网因为链接原因下载会比较慢,推荐使用STMCU中文官网,下载很通畅:STMCU中文官网 安装Java 在安装STM32开发软件STM32CubeMX和STM32CubeIDE、STM32CubeCTL之前&#x…

浏览器事件循环详解

1. 浏览器的进程模型 1.1. 何为进程? 程序运行需要有它自己的专属内存空间,可以把这块内存空间简单的理解为进程。 每个应用至少有一个进程,进程之间相互独立,即使要通信,也需要双方同意。 1.2. 何为线程&#xff1f…

【Linux】进程间通信(3):共享内存

目录 一、共享内存概述 二、共享内存相关函数 1、shmget函数 2、ftok函数 3、shmctl函数 4、 shmat函数 5、 shdt函数 三、使用共享内存相关函数管理共享内存的一般过程 1. 生成唯一的键值 2. 创建或获取共享内存段 3. 连接到共享内存段 4. 操作共享内存 5. 断开…

2024 NVIDIA开发者社区夏令营环境配置指南(Win Mac)

2024 NVIDIA开发者社区夏令营环境配置指南(Win & Mac) 1 创建Python环境 首先需要安装Miniconda: 大家可以根据自己的网络情况从下面的地址下载: miniconda官网地址:https://docs.conda.io/en/latest/miniconda.html 清华大学镜像地…

对提高数据和指令缓存命中率方法的验证

对于如何写出让CPU跑得更快的代码这一问题,我看到了两种方法,分别是:1、提高数据缓存命中率;2、提高指令缓存命中率。 本文对这两种方法进行了简单的验证,并提供了示例代码。 本文基于2.3 如何写出让 CPU 跑得更快的代…

大规模深度学习推理引擎是什么?

🍉 CSDN 叶庭云:https://yetingyun.blog.csdn.net/ 首先,我们来理解 “深度学习”:它是人工智能的一个重要分支,模仿人脑的神经网络结构,运用多层神经网络来学习和解析数据。这些神经网络能够从庞大的数据集…

二、版本更新与插件安装

版本更新 点击版本管理 点击刷新列表后点击一键更新,即可完成更新(注意完成更新必须要关闭正在运行的服务) 更新拓展(更新插件) 点击拓展-刷新列表-一键更新 即可 注意:操作完成以后必须重新启动方可生效…

(六)activiti-modeler 设计器属性编辑弹窗bug修复

BUG重现 在使用流程设计器时,经常碰到弹窗不小心关闭,比如不小心点击了灰色背景上,此时BUG就出现了。弹窗被关闭了,分配用户属性被置空了,以前有数据也被清空了,还无法再次点击弹窗编辑。 不仅仅是分配用…

deque和优先级队列

咱学完栈和队列之后,又了解到了vector和list,更深入的了解到了它们各自的优势,那么有没有可能结合它们的优点摒弃弱点呢,其实是有人这么试过的,不过咱还在学vector和list就证明他可能没成功,不过并不影响我…

python中类class的魔法方法

开始介绍之前,我们先看下之前文章我们介绍过的内置类merryview的一些方法,如下图所示: 有很多双下划线开始和结束的method,这么多method是做啥子用的呢? 其实这些方法就是我们常说的魔法方法,也是python中的…

【代码随想录】二分查找

文章为代码随想录的学习笔记,链接: 代码随想录 只要看到面试题中给出的数组是有序数组,都可以想一想是否可以使用二分法。 基本概念 二分查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。‘ 查找过程&…

2024年华数杯数学建模竞赛——赛题浅析

本次华数杯与国赛同频【第一天下午六点发题,第四天下午八点收卷】,一共74小时。难度约为国赛的0.8,题量约为国赛的0.8-0.9.非常适合作为国赛前的练手赛。下面为大家带来本次华数杯的选题建议,希望对大家有所帮助。 一图流 选题人…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 卢小姐的字符串解压缩(100分) - 三语言AC题解(Python/Java/Cpp)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 💻 ACM金牌🏅️团队| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 🍿 最新华为OD机试D卷目录,全、新、准,题目覆盖率达 95% 以上,支持题…

36-38 关系数据库入门

关系数据库入门 关系数据库概述 数据持久化 - 将数据保存到能够长久保存数据的存储介质中,在掉电的情况下数据也不会丢失。 数据库发展史 - 网状数据库、层次数据库、关系数据库、NoSQL数据库。 1970年,IBM的研究员E.F.Codd在Communication of the ACM…

【Material-UI】Autocomplete中的禁用选项:Disabled options

文章目录 一、简介二、基本用法三、进阶用法1. 动态禁用2. 提示禁用原因3. 复杂的禁用条件 四、最佳实践1. 一致性2. 提供反馈3. 优化性能 五、总结 Material-UI的Autocomplete组件提供了丰富的功能,包括禁用特定选项的能力。这一特性对于限制用户选择、提供更好的用…

长短期记忆网络LSTM

目录 一、LSTM提出的背景:1.RNN存在的问题:2.LSTM的思想:2.1回顾GRU的提出:2.2LSTM在GRU上的改进: 二、遗忘门、输入门、输出门:三、LSTM网络架构:1.候选记忆单元C~t:2.遗忘门、输入…

顶刊TPAMI 2024!无需全标注,仅用少量涂鸦标注即可获得确定和一致的语义分割预测结果...

本文介绍了山东大学,北京大学和纽约州立大学石溪分校合作开展的一项工作。该工作面向图像涂鸦弱标注语义分割任务,重点关注采用涂鸦弱标注时语义分割网络的不确定性和不一致性问题。 作者提出最小化熵损失函数和网络嵌入的随机游走过程来分别改善分割网络…

Altera之FPGA器件系列简介

目录 一、前言 二、命名规则 2.1 MAX V系列 2.2 Cyclone 系列 2.3 Arria 系列 2.4 Stratix 系列 2.5 Agilex 系列 三、器件划分 3.1 工艺制程 3.2 使用领域 四、参考 一、前言 Altera是作为FPGA领域的头部企业,是一家老牌的技术公司,成立于19…

【一图学技术】7.削峰与限流防刷技术解决方案及限流算法图解

削峰与限流防刷技术 一、削峰技术 ✈解决问题:解决流量大的问题,限制单机流量 🚀核心技术: 秒杀令牌:颁发给用户令牌,给予操作特权 秒杀大闸:限制令牌数量 队列泄洪:队列增加缓…