力扣top100-链表类题易错点总结-c++实现(更新中)

  • 首先给一个我之前写的双指针在链表类题中的妙用的link:双指针在链表中的妙用

tip1 来自“合并两个有序链表”

题目链接戳这里
在这里插入图片描述
在这里插入图片描述

  • 这道题注意的就是如果是要返回一个新链表的头结点,一定要新建一个头结点:
ListNode* prehead = new ListNode(-1); 
  • 之后再对prehead的next进行添加,而不是对传进来的参数节点(比如list1)进行遍历、或其他改变后,再直接返回参数节点(当list1遍历的时候指向了尾结点,这样就找不到开始的头结点了)!
  • 代码如下
/*** 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* mergeTwoLists(ListNode* list1, ListNode* list2) {ListNode* prehead = new ListNode(-1); // 申请一片新的空间的办法ListNode* pre = prehead; // 暂时指向这片区域,然后之后只更改nextwhile (list1 != nullptr && list2 != nullptr) {if (list1->val > list2->val) {pre->next = list2;list2 = list2->next;} else {pre->next = list1;list1 = list1->next;}pre = pre->next;}if (list1 != nullptr)pre->next = list1;else if (list2 != nullptr)pre->next = list2;return prehead->next;}
};

跟上上一道题的方法,如果是新建节点怎么做?

  • 用“双数相加”来说,题目链接:link

在这里插入图片描述
在这里插入图片描述

  • 必须用的方法是,不能自己猜想链表结构写别的代码:
//j%10的位置写新的val
//然后插入下一个点
ListNode* temp = new ListNode(j % 10);pre->next = temp;
  • 题目的代码如下
/*** 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* addTwoNumbers(ListNode* l1, ListNode* l2) {ListNode* preHead = new ListNode(-1);ListNode* pre = preHead;int j = 0;// 模拟的思路while (l1 != nullptr || l2 != nullptr || j != 0) {int n1 = l1 ? l1->val : 0;int n2 = l2 ? l2->val : 0;j = j + n1 + n2;// 插入新节点一定要用这种新建的方式ListNode* temp = new ListNode(j % 10);pre->next = temp;j = j / 10;pre = pre->next;if (l1)l1 = l1->next;if (l2)l2 = l2->next;}// 结束条件 l1加完了 或者l2加完了return preHead->next;}
};

另一道用快慢指针的题

  • 所以head不能动,但是可以新建指针指向head,并移动新的指针!
    题目链接

在这里插入图片描述
在这里插入图片描述

  • 思路就是快慢指针,快指针比慢指针先走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) {// 删除链表的倒数第n个节点// 想保留头结点,就新建一个节点去动!// head千万不能动,建立两个快慢指针!ListNode* preHead = new ListNode(-1);preHead->next = head;ListNode* fast = preHead;ListNode* slow = preHead;if (!head->next && n == 1)return nullptr;int count = n - 1; // 先让fastwhile (fast != nullptr && count) {fast = fast->next;count--;}// 直到fast 这个逻辑有点问题 改一下!while (fast != nullptr && fast->next != nullptr &&fast->next->next != nullptr) {fast = fast->next;slow = slow->next;}// 当前的fast指向倒数第二个节点ListNode* slow2 = slow; // 1slow2 = slow2->next;    // 2// fast=fast->next;// 此时fast指向了最后一个节点;slow2这个点是要被去除的slow->next = slow2->next; // 成功去除return preHead->next;}
};

指针只是指针

以下代码是k个一组翻转链表的代码,一道困难题,而我之前总是觉得head指针指错了,直到加了这个代码:

  • 为什么这句话至关重要?因为slow指向了head 但是不代表更新slow就更新了head
            if (slow->next == head)head = p1;

题目链接是这个:题目链接
代码如下:

/*** 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* reverseKGroup(ListNode* head, int k) {if (k == 1)return head;ListNode* preHead = new ListNode(-1);preHead->next = head;ListNode* slow = preHead;ListNode* fast = preHead;int count = k;ListNode* p1;ListNode* p2;ListNode* nxt;fast = fast->next;while (fast) {while (count - 1) {// 如果在移动过程中就遇到空了,其实已经可以return了if (fast->next == nullptr)return head;fast = fast->next;count--;} // 让fast指向最后一个点 只是验证了还剩下这么多节点fast = fast->next; // 移到下一个节点p1 = slow->next;p2 = slow->next->next;while (p2 != fast) {nxt = p2->next; // 存下来的p2->next = p1;p1 = p2;p2 = nxt;}// 如果p2==next了slow->next->next = fast;// 至关重要if (slow->next == head)head = p1;slow->next = p1;while (slow->next != fast) {slow = slow->next;}count = k;}return head;}
};

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

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

相关文章

java框架第二课(Reflection反射机制)

一.关于反射 (1)使用场景介绍 平常我们写代码时,都是已知类名,类的属性,构造方法,其他方法等信息,然后根据类名new对象,这个过程称为正向操作(例如:有一个管理员类,有账号和密码属…

【SQL】三角形判断

目录 题目 分析 代码 题目 表: Triangle ------------------- | Column Name | Type | ------------------- | x | int | | y | int | | z | int | ------------------- 在 SQL 中,(x, y, z)是该表的主键列。 该表的每一行包…

Sigmoid 函数及其导数推导

Sigmoid 函数及其导数推导 1. 了解 Sigmoid 函数 Sigmoid 函数是神经网络中常用的激活函数,因其平滑的S形曲线和将输入压缩至 (0, 1) 的特性,在神经网络的激活函数中扮演着重要角色。其定义如下: σ ( x ) 1 1 e − x \sigma(x) \frac{1…

【应用开发】解决正点原子I.MX6ull应用编程zlib移植问题

问题描述 在正点原子应用开发移植zlib库的时候,文档中有这样一段描述,先删除开发板中的zlib库,然后再拷贝zlib库 这就会导致在使用scp命令拷贝编译好的zlib库的时候报错没有zlib.so.1,如下图所示: 解决方法 千万不…

安卓好软-----手机端提取apk的小工具 方便简单 无需root权限

apk提取工具 工具小巧。可以提取手机上面当前安装的apk和系统应用apk。而且无需root权限即可正常使用。 效果非常不错。比其他工具提取系统app方便好使。 下载:https://download.csdn.net/download/mg668/89683199?spm1001.2014.3001.5503

详解ACL限制SSH、Telnet远程登录及抓包实验

要求&#xff1a;lsw5只能lsw6登录&#xff0c;lsw6只能PC2登录 <Huawei>sys [Huawei]sysname sw2 [sw2]int vlanif1 [sw2-Vlanif1]ip address 192.168.10.2 24 [sw2-Vlanif1]q [sw2] <Huawei>sys [Huawei]sysname sw1 [sw1]int vlanif1 [sw1-Vlanif1]ip address …

视频单条剪、脚本靠手写?云微客开启海量视频时代

老板们注意了&#xff0c;现在已不再是视频单条剪&#xff0c;脚本靠手写的时代&#xff01;在这个信息爆炸的时代&#xff0c;短视频已经成为了现代信息传播和娱乐消费的重要载体&#xff0c;那么我们该如何高效、快速地制作出大量高质量的短视频内容呢&#xff1f;这就需要云…

面试必备:接口自动化测试精选面试题大全

一、 请问你是如何做接口测试的&#xff1f; 大体来说&#xff0c;经历以下过程&#xff1a;接口需求调研、接口测试工具选择、接口测试用例编写、接口测试执行、接口测试回归、接口测试自动化持续集成。具体来说&#xff0c;接口测试流程分成以下九步&#xff1a; 第一步&am…

SpringBoot集成kafka开发-消息消费的分区策略(消费者如何判断从哪个分区中消费消息的?)

这里写目录标题 1、kafak消息者消费消息的4种分区策略2、kafka默认的消费分区策略1-RangeAssignor&#xff08;均匀分配、默认分配策略&#xff09;2.1、代码验证RangeAssignor的消息分区策略2.1.1、消费者2.1.2、生产者2.1.3、kafak配置类2.1.4、对象实体类2.1.5、项目配置文件…

基于vue框架的病床管理信息系统odt4v(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 开题报告内容 基于Vue框架的病床管理信息系统开题报告 一、引言 随着医疗技术的不断进步和人口老龄化的加剧&#xff0c;医院面临着日益增长的医疗服务需求。病床作为医院资源的重要组成部分&#xff0c;其管理效率直接影响到患者的就医体验和医院的运营效…

TCP/UDP的对比,粘包分包抓包,http协议

服务器端&#xff1a; 一、loop 127.0.0.1本地回环测试地址 二、tcp特点 面向连接、可靠传输、字节流 粘包问题&#xff1a;tcp流式套接字&#xff0c;数据与数据之间没有套接字&#xff0c;导致可能多次的数据粘到一起 解决方法&#xff1a;&#xff08;1&#xff09;规…

使用USB转485转接器,从机不响应

在调试485通信时&#xff0c;bms不响应主机&#xff0c;usb转485转换器接收指示灯常亮&#xff0c;现象如下&#xff0c;通过更新驱动程序解决。 更新驱动程序链接&#xff1a; 1. 下载并解压驱动文件 https://www.szutek.com/Uploads/file/20210917/20210917091627_42822.rar…

生信圆桌:专业生信服务器与平台服务的提供者

生信圆桌是一个专注于提供生物信息学&#xff08;生信&#xff09;服务器和平台服务的领先企业&#xff0c;致力于为全球科研机构、企业和独立研究者提供高性能的生信分析解决方案。随着生物信息学研究对计算资源的需求日益增加&#xff0c;生信圆桌凭借其先进的服务器技术和专…

【QT学习】1-2 Liunx环境下QT5.12.9软件安装1——VMware17.0.0虚拟机安装

注意&#xff1a;如果电脑已经安装低版本的VMware&#xff0c;千万不要卸载&#xff0c;直接覆盖安装&#xff0c;更新到新的安装版本 1.点击.exe文件&#xff0c;右键以管理员身份运行&#xff0c;点击下一步&#xff0c;下一步 2.选择软件安装位置后&#xff0c;点击下一步。…

虚幻5|制作一个木桩,含血量及伤害数字

一&#xff0c;基础设置 1.创建Actor蓝图类 2.编辑胶囊体和网格体的碰撞预设 3.打开敌人的角色蓝图&#xff0c;编辑飙血特效 二&#xff0c;创建敌人血量的ui&#xff0c;命名为敌人血量&#xff0c;如下 1. 2&#xff0c;打开后&#xff0c;添加一个画布画板和进度条&#…

ArkUI-布局(一)

ArkUI-布局 布局概述布局元素的组成如何选择布局布局位置对子元素的约束 线性布局部分属性与使用方式 层叠布局部分属性与使用方式 弹性布局基本概念布局方向布局换行主轴对齐方式交叉轴对齐方式容器设置交叉轴对齐方式子元素设置交叉轴对齐方式内容对齐 自适应拉伸 布局概述 …

云端集中管控边缘服务:利用 EMQX ECP 在 K8s 上快速部署 NeuronEX

随着物联网、边缘计算技术的发展&#xff0c;实现边缘服务的快速部署对于分布式计算环境至关重要。它不仅可以显著降低延迟、节省带宽资源、增强数据的安全性和隐私保护&#xff0c;同时还能改善用户体验&#xff0c;支持动态变化的工作负载需求&#xff0c;提供更高的灵活性和…

JAVA毕业设计165—基于Java+Springboot+vue3的二手房交易管理系统(源代码+数据库+11000字论文)

毕设所有选题&#xff1a; https://blog.csdn.net/2303_76227485/article/details/131104075 基于JavaSpringbootvue3的二手房交易管理系统(源代码数据库11000字论文)165 一、系统介绍 本项目前后端分离(还有ssm版本)&#xff0c;分为用户、卖家、管理员三种角色 1、用户&a…

TOMCAT-企业级WEB应用服务器

一 WEB技术 1.1 HTTP协议和B/S 结构 HTTP&#xff08;HyperText Transfer Protocol&#xff09;协议即超文本传输协议&#xff0c;是用于在万维网&#xff08;WWW&#xff09;上传输超文本内容的基础协议。 一、HTTP 协议的特点 1、简单快速 客户向服务器请求服务时&#…

leetcode234. 回文链表(java实现)

题目描述&#xff1a; 本道题的思路可以使用集合先存储链表的值&#xff0c;然后进行判断即可。 总体思路比较简单。 代码实现&#xff1a; class Solution {public boolean isPalindrome(ListNode head) {List<Integer> res new ArrayList();ListNode cur head;whil…