当前位置: 首页 > news >正文

C学习(数据结构)-->单链表习题

目录

一、环形链表

题一:环形链表

思路:

思考一:为什么?

思考二:快指针一次走3步、4步、......n步,能否相遇

step1:

step2:

代码:

题二: 环形链表 II

思路:

思考:为什么?

代码:

二、随机链表的复制

思路:

步骤一:

步骤二:新结点的随机指向结点

步骤三:链接新结点

代码: 


一、环形链表

题一:环形链表

https://leetcode.cn/problems/linked-list-cycle/description/

思路:

使用快慢指针,即慢指针一次走一步,快指针一次走两步,两个指针从链表的头结点往下走,则一定会在环形链表的环中相遇。

思考一:为什么?

设慢指针为 slow ,快指针为 fast ,头结点到入环点的长度为 L,环的长度为 C ,则当 slow 到达入环点时,从 fast 到达 slow 的长度为 N ,则

slow 到达入环点后 slow 和 fast 在环内行走,则

此时变为追击问题,快指针一次走两步,慢指针一次走一步,没走一步,快慢指针之间的距离减一,即:N,N-1,N-2,N-3......3,2,1,0,两指针相遇。

思考二:快指针一次走3步、4步、......n步,能否相遇

step1:

当快指针一次走三步时,每走一步,两指针之间的距离缩小两步,此时分为两种情况

  • N为偶数:N,N-2,N-4,N-6,......4,2,0(两指针相遇 )
  • N为奇数:N,N-2,N-4,N-6,......3,1,-1(两指针错开,进入新一轮追击,此时,两指针之间的距离变为 C +(-1)== C-1 )

此时若 C-1也分两种亲情况

  • C-1为偶数,则 C-1 类似于 N为偶数,两指针相遇
  • C-1为奇数,则 C-1 类似于 N为奇数,两指针错开,那么两者便一直不会相遇

总结:当N为奇数,C为偶数时,两指针 有可能 不会相遇

step2:

还是这张图,当 slow 到达入环点时,假设 fast 已经走了x*C圈,则从中可以得到两指针所走的路程

  • fast:L+x*C+(C-N)
  • slow:L

又因为慢指针一次走一步,快指针一次三步,由此可以得出方程式

3*S(slow)= S(fast) <-----> 3*L = L+x*C+(C-N)<----->  2*L= (x+1)*C-N

因为 2*L 一定为偶数,这满足方程式的情况有两种

  • 偶数 = 偶数 - 偶数
  • 偶数 = 奇数 - 奇数

因此当 N 为偶数时,(x+1)*C一定为偶数,即 C 为偶数;当 N 为奇数时,(x+1)*C一定为奇数,即 C 为奇数,不存在step1中 N为奇数,C为偶数 的情况,则两指针一定会相遇。快指针一次走4、5、......n步同样如此证明。

结论:快指针一次不管走多少步都一定会与慢指针相遇

代码:

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/typedef struct ListNode LN;
bool hasCycle(struct ListNode *head) {LN* slow,*fast;slow = fast = head;while(fast && fast->next){slow = slow->next;fast = fast->next->next;if(slow == fast){return true;}}return false;
}

题二: 环形链表 II

https://leetcode.cn/problems/linked-list-cycle-ii/description/

思路:

让一个指针从头结点开始遍历链表,同时让一个指针从 判定该链表为环形链表的相遇点开始绕环运行,两个指针都是每次只走一步,最终一定会在入口点相遇

思考:为什么?

设头结点为 H ,入环点为 E ,H 到 M 的距离为 L,快慢指针相遇点为 M  ,E 到 M 的距离为 X ,环的长度为 R 则

 则快慢指针相遇时,快(fast)慢(slow)指针相遇时,假设快指针已经绕环走了 n 圈,则,两指针走过的路程

  • fast :L+X+n*R
  • slow:L+X

取快指针一次两步,慢指针一次一步,可得方程式

L+X+n*R = L+X 

化简得 L = n*R-X;

即 L= (n -1)*R+(R-X),n取1,2,3,4......

当n = 1时,L = R-X,则

则 让一个指针从头结点开始遍历链表,同时让一个指针从 判定该链表为环形链表的相遇点开始绕环运行,两个指针都是每次只走一步,最终一定会在入口点相遇、

代码:

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/
typedef struct ListNode LN;
struct ListNode *detectCycle(struct ListNode *head) {LN* slow,*fast;slow = fast = head;while(fast && fast->next){slow = slow->next;fast = fast->next->next;if(slow == fast){slow = head;while(slow != fast){slow = slow->next;fast = fast->next;}return slow;}}return false;
}

二、随机链表的复制

https://leetcode.cn/problems/copy-list-with-random-pointer/description/

思路:

步骤一:

遍历原链表根据结点保存的数据,申请并复制到新的结点,并且插入到该节点后。

步骤二:新结点的随机指向结点

赋值 :新结点的随机指向结点 = 原链表结点的随机指向结点的下一个结点

 

步骤三:链接新结点

 

代码: 

/*** Definition for a Node.* struct Node {*     int val;*     struct Node *next;*     struct Node *random;* };*/
typedef struct Node Node;
//申请新结点
Node* BuyNode(int val)
{Node* newNode = (Node*)malloc(sizeof(Node));newNode->val = val;newNode->next = NULL;newNode->random = NULL;return newNode;
}
//插入原链表
void PushNode(Node* pNode)
{Node* pcur = pNode;while(pcur){Node* pNext = pcur->next;Node* newNode = BuyNode(pcur->val);newNode->next = pNext;pcur->next = newNode;pcur = pNext;}
}
struct Node* copyRandomList(struct Node* head) {if(head == NULL){return head;}//插入原链表PushNode(head);//拷贝randomNode* pcur = head;while(pcur){Node* pcpy = pcur->next;if(pcur->random != NULL){pcpy->random = pcur->random->next;}pcur = pcpy->next;}//链接新链表Node *newHead,*newTail;pcur = head;newHead = newTail = pcur->next;while(pcur->next->next){pcur = pcur->next->next;newTail->next = pcur->next;newTail = pcur->next;} return newHead;
}

相关文章:

C学习(数据结构)-->单链表习题

目录 一、环形链表 题一&#xff1a;环形链表 思路&#xff1a; 思考一&#xff1a;为什么&#xff1f; 思考二&#xff1a;快指针一次走3步、4步、......n步&#xff0c;能否相遇 step1&#xff1a; step2&#xff1a; 代码&#xff1a; 题二&#xff1a; 环形链表 I…...

MATLAB6:M文件和控制流

文章目录 一、实验目的二、实验内容三、仿真结果四、实践中遇到的问题及解决方法 一、实验目的 1. 熟悉运用MATLAB的控制指令。   2. 理解M脚本文件和函数文件的本质区别。   3. 能够运用所学知识&#xff0c;编制程序解决一般的计算问题。 二、实验内容 1.for循环结构及注…...

网页数据抓取:融合BeautifulSoup和Scrapy的高级爬虫技术

网页数据抓取&#xff1a;融合BeautifulSoup和Scrapy的高级爬虫技术 在当今的大数据时代&#xff0c;网络爬虫技术已经成为获取信息的重要手段之一。Python凭借其强大的库支持&#xff0c;成为了进行网页数据抓取的首选语言。在众多的爬虫库中&#xff0c;BeautifulSoup和Scrap…...

Linux应用——网络基础

一、网络结构模型 1.1C/S结构 C/S结构——服务器与客户机&#xff1b; CS结构通常采用两层结构&#xff0c;服务器负责数据的管理&#xff0c;客户机负责完成与用户的交互任务。客户机是因特网上访问别人信息的机器&#xff0c;服务器则是提供信息供人访问的计算机。 例如&…...

白骑士的C++教学实战项目篇 4.3 多线程网络服务器

系列目录 上一篇&#xff1a;白骑士的C教学实战项目篇 4.2 学生成绩管理系统 在这一节中&#xff0c;我们将实现一个多线程网络服务器项目&#xff0c;通过该项目&#xff0c;我们将学习套接字编程的基础知识以及如何使用多线程处理并发连接。此外&#xff0c;我们还将实现一个…...

Go语言并发编程-Context上下文

Context上下文 Context概述 Go 1.7 标准库引入 context&#xff0c;译作“上下文”&#xff0c;准确说它是 goroutine 的上下文&#xff0c;包含 goroutine 的运行状态、环境、现场等信息。 context 主要用来在 goroutine 之间传递上下文信息&#xff0c;包括&#xff1a;取…...

React@16.x(62)Redux@4.x(11)- 中间件2 - redux-thunk

目录 1&#xff0c;介绍举例 2&#xff0c;原理和实现实现 3&#xff0c;注意点 1&#xff0c;介绍 一般情况下&#xff0c;action 是一个平面对象&#xff0c;并会通过纯函数来创建。 export const createAddUserAction (user) > ({type: ADD_USER,payload: user, });这…...

【Qt】QTcpServer/QTcpSocket通信

这里写目录标题 1.pro文件2.服务器3.客户端 1.pro文件 QT network2.服务器 h文件 #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow> #include <QTcpServer> #include <QTcpSocket>QT_BEGIN_NAMESPACE namespace Ui { class MainW…...

【时时三省】单元测试 简介

目录 1,单元测试简介 2,单元测试的目的 3,单元测试检查范围 4,单元测试用例设计方法 5,单元测试判断通过标准 6,测试范围 7,测试频率 8,输出成果 经验建议: 山不在高,有仙则名。水不在深,有龙则灵。 ----CSDN 时时三省 1,单元测试简介 单元测试在以V模型…...

中间件——Kafka

两个系统各自都有各自要去做的事&#xff0c;所以只能将消息放到一个中间平台&#xff08;中间件&#xff09; Kafka 分布式流媒体平台 程序发消息&#xff0c;程序接收消息 Producer&#xff1a;Producer即生产者&#xff0c;消息的产生者&#xff0c;是消息的入口。 Brok…...

中介者模式(行为型)

目录 一、前言 二、中介者模式 三、总结 一、前言 中介者模式&#xff08;Mediator Pattern&#xff09;是一种行为型设计模式&#xff0c;又成为调停者模式&#xff0c;用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地互相引用&#xff0c;从而使其耦合…...

定个小目标之刷LeetCode热题(45)

32. 最长有效括号 给你一个只包含 ( 和 ) 的字符串&#xff0c;找出最长有效&#xff08;格式正确且连续&#xff09;括号 子串的长度。 示例 1&#xff1a; 输入&#xff1a;s "(()" 输出&#xff1a;2 解释&#xff1a;最长有效括号子串是 "()"有事…...

golang 实现负载均衡器-负载均衡原理介绍

go 实现负载均衡器 文章目录 go 实现负载均衡器代码实现介绍负载均衡的核心组件与工作流程核心组件工作流程 总结 算法详细描述&#xff1a;1. 轮询&#xff08;Round Robin&#xff09;2. 最少连接&#xff08;Least Connections&#xff09;3. IP散列&#xff08;IP Hash&…...

spring是如何解决循环依赖的,为什么不是两级

1. Spring使用三级缓存来解决循环依赖问题 Spring使用三级缓存来解决循环依赖问题&#xff0c;‌而不是使用两级缓存。‌ 在Spring框架中&#xff0c;‌解决循环依赖的关键在于正确地管理Bean的生命周期和依赖关系。‌循环依赖指的是两个或多个Bean相互依赖&#xff0c;‌如果…...

大模型预训练优化参数设置

文章目录 基于批次数据的训练学习率优化器稳定优化技术与传统神经网络的优化类似,通常使用批次梯度下降算法来进行模型参数的调优。同时,通过调整学习率以及优化器中的梯度修正策略,可以进一步提升训练的稳定性。为了防止模型对数据产生过度拟合,训练中还需要引入一系列正则…...

PHP pwn 学习 (2)

文章目录 A. 逆向分析A.1 基本数据获取A.2 函数逆向zif_addHackerzif_removeHackerzif_displayHackerzif_editHacker A.3 PHP 内存分配 A.4 漏洞挖掘B. 漏洞利用B.1 PHP调试B.2 exp 上一篇blog中&#xff0c;我们学习了一些PHP extension for C的基本内容&#xff0c;下面结合一…...

【Python学习笔记】:Python爬取音频

【Python学习笔记】&#xff1a;Python爬取音频 背景前摇&#xff08;省流可以不看&#xff09;&#xff1a; 人工智能公司实习&#xff0c;好奇技术老师训练语音模型的过程&#xff0c;遂请教&#xff0c;得知训练数据集来源于爬取某网页的音频。 很久以前看B站同济子豪兄的《…...

4 C 语言控制流与循环结构的深入解读

目录 1 复杂表达式的计算过程 2 if-else语句 2.1 基本结构及示例 2.2 if-else if 多分支 2.3 嵌套 if-else 2.4 悬空的 else 2.5 注意事项 2.5.1 if 后面不要加分号 2.5.2 省略 else 2.5.3 省略 {} 2.5.4 注意点 3 while 循环 3.1 一般形式 3.2 流程特点 3.3 注…...

vue排序

onEnd 函数示例&#xff0c;它假设 drag.value 是一个包含多个对象&#xff08;每个对象至少包含 orderNum 和 label 属性&#xff09;的数组&#xff0c;且您希望在拖动结束后更新所有元素的 orderNum 以反映新的顺序&#xff1a; function onEnd(e) { // 首先&#xff0c;确…...

agv叉车slam定位精度测试标准化流程

相对定位精度 条件&#xff1a;1.5m/s最高速度&#xff1b;基于普通直行任务 数据采集&#xff08;3个不同位置的直行任务&#xff0c;每个任务直行约10m&#xff0c;每个10次&#xff09; 测量每次走过的实际距离&#xff0c;与每次根据定位结果算得的相对距离&#xff0c;两…...

docker-maven-plugin 源码解析:深入理解插件架构与实现原理

docker-maven-plugin 源码解析&#xff1a;深入理解插件架构与实现原理 【免费下载链接】docker-maven-plugin Maven plugin for running and creating Docker images 项目地址: https://gitcode.com/gh_mirrors/doc/docker-maven-plugin 一、插件核心架构概览 docker-…...

FPGA加速中性原子量子计算机的原子检测技术

1. 中性原子量子计算机的原子检测挑战量子计算领域近年来最激动人心的进展之一&#xff0c;就是中性原子量子计算机的快速发展。这种量子计算机利用激光镊子&#xff08;光学镊子&#xff09;阵列来捕获和排列中性原子&#xff08;如铷、铯等碱金属原子&#xff09;&#xff0c…...

Payum实战案例:构建支持多种支付方式的电商平台完整指南 [特殊字符]

Payum实战案例&#xff1a;构建支持多种支付方式的电商平台完整指南 &#x1f680; 【免费下载链接】Payum PHP Payment processing library. It offers everything you need to work with payments: Credit card & offsite purchasing, subscriptions, payouts etc. 项目…...

基于Raspberry Pi Pico的DIY宏键盘:从矩阵扫描到KMK固件实战

1. 项目概述&#xff1a;ClawDeck&#xff0c;一个为游戏玩家打造的桌面控制中心最近在逛一些开发者社区和硬件DIY论坛时&#xff0c;发现一个叫“ClawDeck”的项目挺有意思。项目作者是“gaminghousenursingaide761”&#xff0c;这个名字看起来像是一个个人开发者的ID。ClawD…...

Linux超级计算机Roadrunner的设计与优化实践

1. Linux超级计算机Roadrunner的设计背景与核心理念在1990年代末期&#xff0c;高性能计算领域正处于一个关键的转折点。传统超级计算机如Cray系列虽然性能强大&#xff0c;但价格昂贵且维护成本极高&#xff0c;使得大多数研究机构难以负担。与此同时&#xff0c;个人计算机性…...

眼动追踪技术:DINOv3与合成数据的优化方案

1. 眼动追踪技术概述与挑战眼动追踪技术通过捕捉和分析人眼的注视点位置&#xff0c;能够精确还原用户的视觉注意力分布。这项技术在多个领域展现出重要价值&#xff1a;在VR/AR设备中实现自然交互&#xff0c;在心理学研究中量化视觉认知过程&#xff0c;在用户体验测试中优化…...

手把手教你用GD32F407和LWIP实现一个简易网络调试助手(UDP/TCP双模)

基于GD32F407与LWIP的智能网络调试工具开发实战 在嵌入式设备网络化需求日益增长的今天&#xff0c;如何快速构建一个稳定可靠的网络通信调试工具成为许多工程师面临的挑战。GD32F407作为国产MCU的优秀代表&#xff0c;搭配轻量级TCP/IP协议栈LWIP&#xff0c;能够为各类工业控…...

高效实用的TegraRcmGUI深度指南:Windows平台Switch注入工具进阶应用

高效实用的TegraRcmGUI深度指南&#xff1a;Windows平台Switch注入工具进阶应用 【免费下载链接】TegraRcmGUI C GUI for TegraRcmSmash (Fuse Gele exploit for Nintendo Switch) 项目地址: https://gitcode.com/gh_mirrors/te/TegraRcmGUI 对于Nintendo Switch技术爱好…...

为OpenClaw智能体工作流配置Taotoken作为统一的模型服务后端

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 为OpenClaw智能体工作流配置Taotoken作为统一的模型服务后端 对于使用OpenClaw框架构建AI智能体的开发者而言&#xff0c;一个稳定…...

书匠策AI写毕业论文到底靠不靠谱?我把它的功能拆成“论文通关游戏“讲给你听

各位同学好&#xff0c;我是专门教人写论文的教育博主。 最近后台私信里出现频率最高的一句话是&#xff1a;"老师&#xff0c;书匠策AI到底怎么用&#xff1f;"今天我换个讲法——不列功能清单&#xff0c;而是把写毕业论文想象成一款五关游戏&#xff0c;每一关告…...