day4 链表(2)

Day4
2023.12.3(昨天有事没写,按训练营时间,周天休息,我把第三天的补上)
代码随想录

1. 24两两交换链表中的节点
对于交换节点,不仅仅是值得交换,不然就很简单了,我们要交换的是节点,因此肯定需要定义多个临时节点控制交换,首先循环肯定得一个节点,并且继续采取头指针得方法,方便控制。其次,交换的两个节点需要临时节点存储。
大体思路如下 (注意,这里思路是我自己想得,与代码随想录有一些不同,不要混在一起看。。。) :每次循环,循环节点指向两个需要交换节点得前一个节点,比如刚开始就指向头节点。当循环节点得next和next->next都为空时不满足交换条件(要么交换完了,要么节点数为奇数,最后剩一个节点不用交换。)然后循环中定义两个临时节点之江要交换的两个节点,在第一个循环中,也就是分别指向head->next和head->next->next;然后就是交换了,步骤很简单,但要注意顺序,第一步:循环节点next指向head->next->next,这就完成了第一步交换,后节点变到前面来了,第二步就是将原前节点->next连接到后续链表中,注意这里理解为什么要先连接到后续待处理链表上,而不是先将交换节点相连(因为交换节点相连,就是原后节点->next=原前节点,如果先进行这一步,那后续链表不就丢了吗?因为原后节点->next变了,那原始后面的一堆链表地址不就没了?),想象一下目前进行两步得结果,两个需要交换的链表,前面连接好了,后面连接好了,只剩下将两个需要连接得节点连在一起了,因此第三步就是原后节点->next=原前节点。循环就这三部,大功告成!

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode() : val(0), next(nullptr) {}*     ListNode(int x) : val(x), next(nullptr) {}*     ListNode(int x, ListNode *next) : val(x), next(next) {}* };*/
class Solution {
public:ListNode* swapPairs(ListNode* head) {ListNode*node = new ListNode(0);node->next = head;ListNode*n_node = node;while(n_node->next!=nullptr && n_node->next->next!=nullptr){ListNode * pre = n_node->next;ListNode * next_node = n_node->next->next;n_node->next = next_node;pre->next = next_node->next;next_node->next = pre;n_node = pre;}return node->next;}
};

2. 19删除链表的倒数第N个节点
这道题思路很巧妙,不接触得话感觉很难想到这种方法–双指针。很麻瓜的办法就是遍历算长度。。在遍历删除。。就不细说了。
本题思路:双指针,删除倒数第n个节点,也就是说删除节点跟最后一个节点的距离是n-1,那我们定义两个距离为n-1的指针,这样,一前一后,当前面指针指向最后一个节点时,那后面指针是不是就是我们要删除的节点呢?非常巧的方法,当然,这里说的距离可能有些不准确,但想表达的意思明白就行,具体的判断,我是手动推导两三种情况的逻辑下确定的,虽然挺费时间,但手动推导还是很有用的。
有一步是我没有注意的,后节点是我们要删除的节点,但好像没办法直接删除它,开始一直出错,最后才发现这个问题,因此有个技巧,控制好快慢指针的距离后,让前指针多走一步!。这样最后后者就是指向要删除节点的前一个指针,这样删除是不是就很方便了!

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode() : val(0), next(nullptr) {}*     ListNode(int x) : val(x), next(nullptr) {}*     ListNode(int x, ListNode *next) : val(x), next(next) {}* };*/
class Solution {
public:ListNode* removeNthFromEnd(ListNode* head, int n) {ListNode *node = new ListNode(0);node->next = head;ListNode*low = node;ListNode*fast = node;while(n-->0){fast = fast->next;}fast = fast->next;while(fast!=nullptr){low = low->next;fast = fast->next;}low->next = low->next->next;return node->next;}
};

3. 07链表相交
这道题想了一会,感觉很直接的方法就是遍历长度,求差值,较长的链表前进该距离,让两个链表指针保持在同一相对位置,然后同时遍历就好,循环中一个if语句就行,挺麻瓜且直接的办法。。最后看代码随想录也是这种办法。也就不多想了。
代码逻辑很简单,但开始犯了个简单错误,遍历算长度后应该再次给两个索引节点赋给两个头节点,第一次没注意这个,因此后续较短链表遍历就出错了。

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode(int x) : val(x), next(NULL) {}* };*/
class Solution {
public:ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {ListNode* a_node = headA;ListNode* b_node = headB;int a=0,b=0;while(a_node!=NULL){a_node=a_node->next;a++;}while(b_node!=NULL){b_node=b_node->next;b++;}a_node = headA;b_node = headB;int temp =a>b ? a-b:b-a;if(a>b){while(temp--){a_node = a_node->next;}}else{while(temp--){b_node = b_node->next;}}while(a_node!=NULL){if(a_node==b_node){return a_node;}a_node = a_node->next;b_node = b_node->next;}return NULL;}
};

4. 142环形链表Ⅱ
这道题以前做过,只记得判断有无环状是通过快慢指针判断的,即一个指针走两个,一个指针走一个,如果能遇到,则有环,不能遇到,则没有环。但对于怎么找到环入口的方法却忘z了。看了代码随想录后,觉得很神奇,确定有环后,即fast=slow,重新定义两个指针,一个指向相遇点,另一个指向链表第一个节点,两者同时移动,相遇点即是环状入口点。当然,这是结论,理论过程需要推导,可以见代码随想录详细解释

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode(int x) : val(x), next(NULL) {}* };*/
class Solution {
public:ListNode *detectCycle(ListNode *head) {ListNode*fast = head;ListNode*low = head;while(fast!=NULL&&fast->next!=NULL){low = low->next;fast = fast->next->next;if(fast==low){ListNode *a = fast;ListNode*b = head;;while(a!=b){a = a->next;b = b->next;}return a;}}return NULL;}
};

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

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

相关文章

继阿里云、滴滴、语雀后,腾讯视频也出现重大系统故障

昨晚,许多网友报告称腾讯视频出现了网络故障,具体表现为首页无法加载内容、VIP 用户无法观看会员视频等问题。 针对这一问题,腾讯视频回应称:目前腾讯视频遇到了暂时的技术问题,正在紧急修复中,各项功能正在…

在项目根目录未找到 app.json

这个问题就是我们在编译后的app.json文件找不到,路径出现了问题 首先看dist下我们该文件的路径 所以我们需要将该路径配置到我们project.config.json文件中去 在这里新加下面这行代码就可以了, "miniprogramRoot": "dist/dev/mp-weixi…

C语言扫雷游戏

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、扫雷游戏的分析和设计1.1扫雷游戏的功能说明1.2数据结构的分析1.3文件结构设计 二、扫雷游戏的代码实现总结 前言 详细介绍扫雷游戏的思路和实现过程。 一…

虚拟化逻辑架构:OVS 交换机与端口管理

目录 一、实验 1.OVS 交换机管理 2.OVS端口管理 二、问题 1.KVM下的br0和virbr0有何区别 一、实验 1.OVS 交换机管理 (1)查看网络信息 lo:本地回环接口 enp0s17 : ubuntu系统识别到的物理网卡 virbr0/br1/virbr0-nic : linux bridge 网桥相关…

基于springboot + vue体育馆使用预约平台

qq(2829419543)获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:springboot 前端:采用vue技术开发 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件&#xf…

自动提交日志脚本(6)浏览器抓包日志提交的数据

主要完成 do_logigdo_write_log 通过python的requests库post数据上传,因为是公司的系统我就展示抓包了,不展示怎么写了。 这边用日志暂存的页面做展示。 步骤 打开对应的页面,再打开浏览器的开发人员工具【一般是按f12】点击暂存按钮&…

【算法思考记录】力扣2134. 最少交换次数来组合所有的 1 II【Python3,滑动窗口】

最少交换次数来组合所有的 1 II - 解题思路与代码分析 题目描述 本题目要求我们找到在一个环形二进制数组中,通过最少的交换次数把所有的 1 聚集在一起的方法。数组的环形特性意味着第一个元素和最后一个元素是相邻的。我们需要考虑数组的这种特殊结构来找到最优解…

【MySQL的基本命令{DML 和 DDL}】

MySQL的基本命令 {DML 和 DDL} MySQL的基本命令展示所有数据库展示某个数据库中所有的表切换到某个数据库查看当前在哪个数据库查询一张表的全部数据新建一个数据库新建一张表插入一条数据删除一个表删除一个库描述表的信息展示表的创建sql代码展示库的创建sql代码导出数据 &am…

每周一算法:背包问题(三)多重背包

多重背包 有 N N N件物品和一个容量是 M M M的背包。第 i i i种物品最多有 s i s_i si​件,每件的体积是 v i v_i vi​,价值是 w i w_i wi​。 求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。 输…

日常巡检脚本-2

#!/bin/bash# 检查系统负载 load$(awk {print $1} /proc/loadavg) cores$(grep -c ^processor /proc/cpuinfo) load_threshold$(echo "scale2; $cores * 0.7" | bc) if [ "$(echo "$load > $load_threshold" | bc)" -ne 0 ]; thenecho "…

浅谈什么是语音芯片的白噪音支持功能:打造舒适家居与优质音频体验

随着科技的不断进步和人们对生活质量要求的提升,语音芯片已经成为了现代电子产品中不可或缺的一部分。而在这些语音芯片中,支持白噪音的功能逐渐受到人们的关注。本文将围绕语音芯片中的白噪音支持功能展开讨论,带您领略其带来的舒适家居与优…

最强Node js 后端框架学习看这一篇文章就够

距离上次认真花时间写作,似乎已经过了许久许久,前端讲了一个新框架 ,叫 Nest.js 下方是课件,有过一定开发经验可跟随视频学习 B站 地址 : https://www.bilibili.com/video/BV1Lg4y197u1/?vd_sourcead427ffaf8a5c8344…

Linux --- 进程控制

目录 1. 进程创建 1.1. 内核数据结构的处理 1.2. 代码的处理 1.3. 数据的处理: 方案一:fork创建子进程的时候,直接对数据进行拷贝处理,让父子进程各自私有一份 方案二:写实拷贝(copy on write) 1.4. fork常规用…

精通Nginx(21)-大幅度提升性能优化方法

无论何种类型的服务器或应用,其性能都取决于许多可变项,包括但不限于物理硬件、操作系统、数据库、应用服务器等中间件、应用结构等。性能优化通常在碰到性能瓶颈时才进行调优测试,确定瓶颈,改进限制,并不断重复,直至满足性能需求。 本文仅针对Nginx作为一个中间…

18本书让你从现代骗局中醒来

下面十八本书籍可以让你从受限的上下文骗局中脱身,或者至少能意识到: 1、《Be Here Now》Ram Dass: 是 1971 年出版的一本关于灵性、瑜伽和冥想的书,作者是美国瑜伽士兼灵性导师拉姆达斯(Ram Dass,原名理查…

后端Long型数据传到前端js后精度丢失的问题

假设一个场景,MybatisPlus的雪花算法生成long类型主键ID,存入数据库,前端获取到数据后,要执行一个更新操作(updateById),但这时会出现无法成功更新的情况!这是因为前端在长度大于17位…

24.Python 网络编程之socket编程

目录 1.认识TCP/IP2.socket编程2.1 使用socket2.2 使用socketserver 1.认识TCP/IP 计算机网络就是把各个计算机连接在一起,在网络中的计算机可以互相通信。 网络编程是如何在程序中实现两台计算机的通信。 网络通信是两台计算机上的两个进程之间的通信。 为了把…

DevOps|研发提效-敏捷开发之每日站立会

对于研发效能团队建设和组织,本文不再赘述,可以参考之前的文章,已经讲得很透彻了。本文重点讲我们日常是怎么开站立会,怎么让团队跑起来,高效能产出的。每日站立会,15分钟到30分钟,看似非常短的…

【编码魔法师系列_构建型1.3 】抽象工厂模式(Abstract Factory)

学会设计模式,你就可以像拥有魔法一样,在开发过程中解决一些复杂的问题。设计模式是由经验丰富的开发者们(GoF)凝聚出来的最佳实践,可以提高代码的可读性、可维护性和可重用性,从而让我们的开发效率更高。通…

数字信号处理_第4个编程实例(信号的采样与重建)

配套的讲解视频详见数字信号处理14-1_模拟信号转换至数字信号的过程_哔哩哔哩_bilibili,数字信号处理14-2_冲激串的傅里叶变换及采样过程的时频域表示_哔哩哔哩_bilibili,数字信号处理14-3_信号重建与采样定理及Matlab编程实例_哔哩哔哩_bilibili %% //…