【数据结构】“单链表”的练习题(二)

在这里插入图片描述

💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤
📃个人主页 :阿然成长日记 👈点击可跳转
📆 个人专栏: 🔹数据结构与算法🔹C语言进阶
🚩 不能则学,不知则问,耻于问人,决无长进
🍭 🍯 🍎 🍏 🍊 🍋 🍒 🍇 🍉 🍓 🍑 🍈 🍌 🍐 🍍

文章目录

  • 链表的回文结构
  • 160.相交链表
  • 141.环形链表(LeetCode)
  • leetcode142.环形链||
  • LeetCode138.复制带随机指针的链表

前言:

最近在刷题的铁子们,你们在做题的时候一定要画图,人的思维固然很强,但是把图画好是真香啊!遇到BUGl了照着图分析,十分简洁明朗,事半功倍。

链表的回文结构

题目:对于一个链表,请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法,判断其是否为回文结构。给定一个链表的头指针A,请返回一个bool值,代表其是否为回文结构。保证链表长度小于等于900。

测试样例: 1->2->2->1 返回:true

思路:
1.找到中间节点
2.从中间节点往后逆置
3.定义快慢指针,向后遍历判断是否相等。
在这里插入图片描述

class PalindromeList {
public:struct ListNode* middleNode(struct ListNode* head){struct ListNode* slow = head,*fast = head;while(fast&& fast->next){slow = slow->next;fast = fast->next->next;}return slow;}struct ListNode* reveseList(struct ListNode* head){struct ListNode* cur = head;struct ListNode* newhead = nullptr;while(cur){struct ListNode* next = cur->next;cur->next = newhead;newhead  = cur;cur = next;} return newhead;} bool chkPalindrome(ListNode* head) {// write code herestruct ListNode* mid = middleNode(head);struct ListNode* rmid = reveseList(mid);while(rmid && head){if(rmid->val !=head->val){return false;}rmid = rmid->next;head = head->next;}return true;}
};

160.相交链表

题目:

给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。
图示两个链表在节点 c1 开始相交:
在这里插入图片描述
题目数据 保证 整个链式结构中不存在环。

注意,函数返回结果后,链表必须 保持其原始结构 。

自定义评测:

评测系统 的输入如下(你设计的程序 不适用 此输入):

intersectVal - 相交的起始节点的值。如果不存在相交节点,这一值为 0 listA - 第一个链表 listB - 第二个链表
skipA - 在 listA 中(从头节点开始)跳到交叉节点的节点数 skipB - 在 listB
中(从头节点开始)跳到交叉节点的节点数 评测系统将根据这些输入创建链式数据结构,并将两个头节点 headA 和 headB
传递给你的程序。如果程序能够正确返回相交节点,那么你的解决方案将被 视作正确答案 。

思路:
1.分别计算listA,listB链表的长度
2.取两绝对值,对齐两个链表,同时开始遍历,当相同就相交了。
在这里插入图片描述

代码:

struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {struct ListNode* curA = headA,*curB = headB;//分别计算A,B链表的长度int lenA =1,lenB =1;while(curA->next){curA = curA->next;lenA++;}while(curB->next){curB = curB->next;lenB++;}//此时curA,B都已指向最后节点,如果不相等,则说明不相交if(curA != curB){return NULL;}//求出相差的步数int n = abs(lenA-lenB);struct ListNode* LongList = headA,* ShortList = headB;if(lenA<lenB){LongList = headB;ShortList = headA;}//先让长的链表走n步,与短链表对齐while(n--){LongList = LongList->next;}//同时走,找相同;while(LongList!=ShortList){LongList = LongList->next;ShortList = ShortList->next;}return ShortList;
}

在这里插入图片描述

141.环形链表(LeetCode)

给你一个链表的头节点 ,判断链表中是否有环。head

如果链表中有某个节点,可以通过连续跟踪 指针再次到达,则链表中存在环。为了表示给定链表中的环,评测系统内部使用整数 来表示链表尾连接到链表中的位置(索引从 0 开始)。注意:pos 不作为参数进行传递 。仅仅是为了标识链表的实际情况。nextpos

如果链表中存在环 ,则返回 。否则,返回 。truefalse
在这里插入图片描述

思路:

在这里插入图片描述
代码:

bool hasCycle(struct ListNode *head) {struct ListNode *fast = head,*low = head;while(fast && fast->next){fast = fast->next->next;low = low->next;if(fast == low){return true;}}return false;
}

在这里插入图片描述

leetcode142.环形链||

题目要求:

给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。

如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos来表示链表尾连接到链表中的位置(索引从 0 开始)。如果 pos 是 -1,则在该链表中没有环。
注意:pos不作为参数进行传递,仅仅是为了标识链表的实际情况。不允许修改 链表。

思路分析:
🔸如果链表存在环,则fast和slow会在环内相遇,定义相遇点到入口点的距离为X,定义环的长度为C,定义头到入口的距离为L,fast在slow进入环之后一圈内追上slow,则会得知:
🔸slow所走的步数为:L + X
🔸fast所走的步数为:L + X + N * C
并且fast所走的步数为slow的两倍,故:
🔸2*(L + X) = L + X + N * C
即: L = N * C - X
所以从相遇点开始slow继续走,让一个指针从头开始走,相遇点即为入口节点

struct ListNode *detectCycle(struct ListNode *head) {struct ListNode* fast,*slow;slow = fast = head;while(fast && fast->next){slow = slow->next;fast = fast->next->next;if(slow == fast){struct ListNode* meet = slow;while(head != meet){head = head->next;meet = meet->next;}return meet;}}return NULL;}

LeetCode138.复制带随机指针的链表

题目要求:
在这里插入图片描述
在这里插入图片描述

·读题·:首先,这道题目的意思是完整的复制一遍链表,难点在于每个节点有一个随机指针,由于题目要求不能指向原来链表,所以他的复制成了一个难点。

解决步骤:
1.在原链表每个节点之后插入一个复制节点 (复制前一个节点)。
2.给复制节点中的random进行指向。
3.把所有的复制节点拿下来整理成新列表,
思路图:
在这里插入图片描述

代码:

struct Node* copyRandomList(struct Node* head) {struct Node* cur = head;//复制每个节点并插入到相应节点之后while(cur){struct Node* next = cur->next;struct Node* copy = (struct Node*)malloc(sizeof(struct Node));//给copy赋值内容copy->val = cur->val;//插入cur->next = copy;copy->next = next;//向后移动过cur指针和next指针cur = next;}//处理random指向cur = head;while(cur){struct Node* copy = cur->next;if(cur->random==NULL){copy->random = NULL;}else{//精华所在copy->random = cur->random->next;//指向原链表的复制节点}cur = copy->next;}//将新链表整理出来cur = head;//制造一个哨兵位作为新链表的头结点,便于插入 struct Node* copyhead = (struct Node*)malloc(sizeof(struct Node));copyhead->val = 1;copyhead->next = NULL;copyhead->random = NULL;//定义一个节点,遍历新链表。为了保存原链表的头。struct Node* pcopyhead = copyhead;while(cur){struct Node* copy = cur->next;struct Node* next = copy->next;//尾插到新链表pcopyhead->next = copy;pcopyhead = pcopyhead->next;//恢复原链表cur->next = next;cur = next;}return copyhead->next;
}

在这里插入图片描述
注意点:切记如果使用了哨兵位那么一定要给它进行初始化。

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

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

相关文章

沁恒ch32V208处理器开发(三)GPIO控制

目录 GPIO功能概述 CH32V2x 微控制器的GPIO 口可以配置成多种输入或输出模式&#xff0c;内置可关闭的上拉或下拉电阻&#xff0c;可以配置成推挽或开漏功能。GPIO 口还可以复用成其他功能。端口的每个引脚都可以配置成以下的多种模式之一&#xff1a; 1 浮空输入 2 上拉输入…

Linux系统中基于NGINX的代理缓存配置指南

作为一名专业的爬虫程序员&#xff0c;你一定知道代理缓存在加速网站响应速度方面的重要性。而使用NGINX作为代理缓存服务器&#xff0c;能够极大地提高性能和效率。本文将为你分享Linux系统中基于NGINX的代理缓存配置指南&#xff0c;提供实用的解决方案&#xff0c;助你解决在…

Ubuntu设置定时重启

1.安装/更新 cron 安装crontab sudo apt-get install cron更新命令 sudo apt-get update2.配置cron定时任务 sudo nano /etc/crontab* * * * * root reboot(从左到右&#xff0c;五个 * 依次是 分&#xff0c;时 &#xff0c;天&#xff0c;月&#xff0c;星期)下列命令表示…

vivo手机录屏在哪里?我来告诉你!(2023最新)

“有人知道vivo手机录屏在哪里吗&#xff1f;刚买了最新款的vivo手机&#xff0c;就是找不到录屏功能在哪&#xff0c;刚好最近需要录屏&#xff0c;很烦躁&#xff0c;有人会吗&#xff0c;求求啦” 随着智能手机的普及&#xff0c;录屏功能逐渐成为用户喜爱的功能之一。vivo…

iTOP-3568开发板使用OpenCV处理图像-颜色转换

本小节代码在配套资料“iTOP-3568 开发板\03_【iTOP-RK3568 开发板】指南教程 \04_OpenCV 开发配套资料\05”目录下&#xff0c;如下图所示&#xff1a; cv2.cvtColor()函数功能&#xff1a; 将一幅图像从一个色彩空间转换到另一个色彩空间。 函数原型&#xff1a; cv2.cvt…

实践-CNN卷积层

实践-CNN卷积层 1 卷积层构造2 整体流程3 BatchNormalization效果4 参数对比5 测试效果 1 卷积层构造 2 整体流程 根据网络结构来写就可以了。 池化 拉平 训练一个网络需要2-3天的时间。用经典网络来&#xff0c;一些细节没有必要去扣。 损失函数&#xff1a; fit模型&…

电脑ip地址怎么改 ip地址怎么改到别的城市

一、ip地址怎么改到别的城市 1.ip地址怎么改到别的城市&#xff0c;1、重启WIFI路由设备 一般手机或电脑在家或公司上网时都是接入到路由器的WIFI网络,再由路由器分配上网IP地址,如果要更换上网IP那么重启路由器设备后,路由器会向网络运营商进行宽带的重新拨号,此时手机或电脑设…

【Microsoft 支持】【数据库-MySql】当您尝试从大于 5000 的 TCP 端口连接时收到错误 WSAENOBUFS (10055)

​ 一、转载原文 When you try to connect from TCP ports greater than 5000 you receive the error ‘WSAENOBUFS (10055)’ Symptoms If you try to set up TCP connections from ports that are greater than 5000, the local computer responds with the following WSAE…

Redis 缓存过期及删除

一、Redis缓存过期策略 物理内存达到上限后&#xff0c;像磁盘空间申请虚拟内存(硬盘与内存的swap),甚至崩溃。 内存与硬盘交换 (swap) 虚拟内存&#xff0c;频繁I0 性能急剧下降&#xff0c;会造成redis内存急剧下降&#xff1b; 一般设置物理内存的3/4&#xff0c;在redis…

AssetBundle总结

文章目录 目的打包过程打包时的分组策略和压缩方式资源的载入和卸载其它&#xff1a;Manifest、校验、视图工具思维导图 前言&#xff1a; 大佬文章链接&#xff08;据此总结的&#xff09; 目的 避免软件因资源占用空间太大&#xff0c;导致运行缓慢 避免每次更新资源&#…

adb对安卓app进行抓包(ip连接设备)

adb对安卓app进行抓包&#xff08;ip连接设备&#xff09; 一&#xff0c;首先将安卓设备的开发者模式打开&#xff0c;提示允许adb调试 二&#xff0c;自己的笔记本要和安卓设备在同一个网段下&#xff08;同连一个WiFi就可以了&#xff09; 三&#xff0c;在笔记本上根据i…

Openlayers 实战 - 地图视野(View)- 图层 -(layer)- 资源(source)显示等级设置。

Openlayers 实战 - 地图视野&#xff08;View&#xff09;- 图层 -&#xff08;layer&#xff09;- 资源&#xff08;source&#xff09;显示等级设置。 问题原因核心代码完整代码&#xff1a;在线示例 在以往的项目维护中&#xff0c;出现一个问题&#xff0c;使用最新高清底图…