算法刷题-链表系列-移除链表、设计链表、翻转列表

题目要求

所有主要考察对链表的增删查改的功能

总结

  1. 对于有些从头遍历到尾的方法,创建一个头结点使得所有的结点能以统一的方式且全部被遍历到,不会出现头结点不被遍历的问题。
  2. 对于遍历的条件,有的时候curNode != nullptr,有的时候是curNode->next != nullptr,看作用范围。
  3. 对于增删查改,尤其是查询类涉及到输入index的,注意判断index的越界问题,是否大于0及是否大于链表长度从而进行处理。

移除链表元素-简单

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

示例:
输入:head = [1,2,6,3,4,5,6], val = 6
输出:[1,2,3,4,5]

要点

就是注意删除的话,可以考虑删除当前节点的next的val,这样不会丢失链接。循环结束的标志也是current->next==nullptr。

可能会有的疑惑:
1.循环结束的条件会不会导致最后一个结点没有被遍历?
答:不会的,因为每一次current都判断的是下一个节点是否被删。所以最后一个在上一次遍历已经判断过了。
2.初始的那个结点会不会没有遍历到?
有可能会,所以我们创建一个虚拟的头结点,虚拟的头结点->next=head,这样就能遍历到所有的值

代码

/*** 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* removeElements(ListNode* head, int val) {//创建虚拟头结点ListNode* firstNode = new ListNode(0); firstNode -> next = head;ListNode* cur = firstNode;ListNode* temp;while(cur -> next) {if(cur -> next -> val == val) {temp = cur -> next;cur -> next = cur -> next -> next;delete temp;} else {cur = cur -> next;}}return firstNode -> next;}
};

设计链表-中等

你可以选择使用单链表或者双链表,设计并实现自己的链表。
要求:
1.单链表中的节点应该具备两个属性:val 和 next 。val 是当前节点的值,next 是指向下一个节点的指针/引用。
2.如果是双向链表,则还需要属性 prev 以指示链表中的上一个节点。假设链表中的所有节点下标从 0 开始。
3.实现 MyLinkedList 类:
MyLinkedList()初始化 MyLinkedList 对象。
int get(int index) 获取链表中下标为 index 的节点的值。如果下标无效,则返回 -1 。
void addAtHead(int val)将一个值为 val 的节点插入到链表中第一个元素之前。在插入完成后,新节点会成为链表的第一个节点。
void addAtTail(int val) 将一个值为 val 的节点追加到链表中作为链表的最后一个元素。
void addAtIndex(int index, int val)将一个值为 val 的节点插入到链表中下标为 index 的节点之前。如果 index 等于链表的长度,那么该节点会被追加到链表的末尾。如果 index 比长度更大,该节点将 不会插入 到链表中。
void deleteAtIndex(int index)如果下标有效,则删除链表中下标为 index 的节点。

要点

注意看清题目给的类是一个链表类而非一个结点类。所以需要自己定义一个结点类
同样的最好给这个链表一个虚拟头结点,这样便于统一的做一些操作。
一定要先浏览一遍题目,其实可以不用给链表定义一个length,但看void addAtIndex(int index, int val)中有提到关于长度的内容,所以还是要定义一个,不要偷懒。

class MyLinkedList {
public:struct myListNode {int val;myListNode* next;myListNode(int val) : val(val), next(nullptr) {}};MyLinkedList() {head = new myListNode(0);length = 0;}int get(int index) {if (index < 0 || index >= length) return -1;myListNode* curNode = head->next;for (int i = 0; i < index; ++i) {curNode = curNode->next;}return curNode->val;}void addAtHead(int val) {myListNode* newNode = new myListNode(val);newNode->next = head->next;head->next = newNode;++length;}void addAtTail(int val) {myListNode* newNode = new myListNode(val);myListNode* curNode = head;while (curNode->next) {curNode = curNode->next;}curNode->next = newNode;++length;}void addAtIndex(int index, int val) {if (index > length) return;if (index <= 0) {addAtHead(val);} else if (index == length) {addAtTail(val);} else {myListNode* newNode = new myListNode(val);myListNode* curNode = head;for (int i = 0; i < index; ++i) {curNode = curNode->next;}newNode->next = curNode->next;curNode->next = newNode;++length;}}void deleteAtIndex(int index) {if (index < 0 || index >= length) return;myListNode* curNode = head;for (int i = 0; i < index; ++i) {curNode = curNode->next;}myListNode* temp = curNode->next;curNode->next = temp->next;delete temp;--length;}private:myListNode* head;int length;
};

翻转链表 - 简单

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

示例:
在这里插入图片描述

要点

利用双指针法,一个pre代表上一个结点的地址,一个cur代表当前节点的地址,我们要做的就是让cur->next = pre。
依据上面的推断,当实现了cur->next = pre时,要让cur继续按照原先的顺序往下走,我们还需要一个保存cur的下一个结点的地址的temp。
因此逻辑就是:每一次遍历,更新cur->next阶段:temp=cur->next,cur->next=pre,更新pre阶段:pre = cur,更新cur阶段:cur = temp;

需要注意的是,每一次遍历改变的是进入循环时刻的pre和cur之间的链表指向关系。

代码

/*** 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* reverseList(ListNode* head) {ListNode* pre = nullptr;ListNode* cur = head;ListNode* temp;while(cur) {temp = cur ->next;cur -> next = pre;pre = cur;cur = temp;}//当遍历完之后,此时的cur已经指向链表外了。即最后一个结点(此时是pre)的next故为空,=退出循环return pre;}
};

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

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

相关文章

Django项目中创建app并快速上手(pycharm Windows)

1.打开终端 我选择的是第二个 2.运行命令 python manage.py startapp 名称 例如&#xff1a; python manage.py startapp app01 回车&#xff0c;等待一下&#xff0c;出现app01的文件夹说明创建成功 3.快速上手 1.app注册 增加一行 "app01.apps.App01Config"&#…

Windows系统安装搭建悟空crm客户管理系统 教程

1、在安装悟空 CRM 之前&#xff0c;需要确保你的 Windows 系统上已经安装了以下软件&#xff1a; Web 服务器&#xff1a;推荐使用 Apache 或 Nginx&#xff0c;这里以 Nginx 为例。你可以使用集成环境套件如 XAMPP 来简化安装过程&#xff0c;它包含了 Nginx 、MySQL、PHP 等…

深度学习框架探秘|TensorFlow vs PyTorch:AI 框架的巅峰对决

在深度学习框架中&#xff0c;TensorFlow 和 PyTorch 无疑是两大明星框架。前面两篇文章我们分别介绍了 TensorFlow&#xff08;点击查看&#xff09; 和 PyTorch&#xff08;点击查看&#xff09;。它们引领着 AI 开发的潮流&#xff0c;吸引着无数开发者投身其中。但这两大框…

java每日精进 2.13 Ganache(区块链本地私有化部署)

需求&#xff1a;使用区块链实现数据村存储&#xff0c;记录一些不可篡改的交互信息&#xff0c;网络环境为内外网均需要部署&#xff1b; 1.准备工作&#xff08;软件安装&#xff09; 1.1 安装 Node.js 和 npm 1.2 安装 Ganache 地址如下&#xff1a;windows有可视化界面 &a…

w206基于Spring Boot的农商对接系统的设计与实现

&#x1f64a;作者简介&#xff1a;多年一线开发工作经验&#xff0c;原创团队&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取&#xff0c;记得注明来意哦~&#x1f339;赠送计算机毕业设计600个选题excel文…

chrome://version/

浏览器输入&#xff1a; chrome://version/ Google浏览器版本号以及安装路径 Google Chrome131.0.6778.205 (正式版本) &#xff08;64 位&#xff09; (cohort: Stable) 修订版本81b36b9535e3e3b610a52df3da48cd81362ec860-refs/branch-heads/6778_155{#8}操作系统Windows…

哈希槽算法与一致性哈希算法比较

Redis 集群模式使用的 哈希槽&#xff08;Hash Slot&#xff09; 算法与传统的 一致性哈希&#xff08;Consistent Hashing&#xff09; 算法在数据分布和节点管理上有显著的区别。以下是两者的详细比较&#xff1a; 1. Redis 哈希槽算法 1.1 基本原理 Redis 集群将整个数据集…

【BUUCTF逆向题】[WUSTCTF2020]level3(魔改base64)

一.[WUSTCTF2020]level3 打开IDA反汇编&#xff0c;发现就是base64加密 这里rand就是与&搭配设置奇偶数2分随机 但是根据提示不是标准base64加密 首先想到魔改密码表&#xff0c;追踪进去&#xff0c;发现没有什么变化啊 尝试对Base64字符串解码也不对 追踪密码表CtrlX发…

有关Java中的接口

学习目标 掌握接口语法理解接口多态熟练使用接口了解接口新特性掌握final关键字了解lambda语法 1.接口语法 1.1 接口概念 从功能上看, 实现接口就意味着扩展了某些功能 接口与类之间不必满足is-a的关系结构 从抽象上看, 接口是特殊的抽象父类 从规则上看, 接口定义者和实…

鸿蒙(openharmony) 5.0 光感接口崩溃

目录 1.背景 2.解决方案 1.背景 使用OpenHarmony 5.0调用光感接口崩溃,返回的值是undefined,接口如下: sensor.on(sensor.SensorId.AMBIENT_LIGHT, (data) => {if (data == null || data == undefined || data.intensity == null || data.intensity == undefined) {ret…

git用法(简易版)

介绍 git是一个版本管理工具 使用方法 建立仓库 第一步 git init&#xff1a;初始化仓库 第二步 git add .&#xff1a;将代码添加到暂存区 第三步 git commit -m "first"&#xff1a;为修改添加备注 第四步 git remote add origin 你的url 第五步 git pus…

【C++八股】内存泄漏

内存泄漏&#xff08;Memory Leak&#xff09;是指程序在动态分配内存后&#xff0c;未能及时释放已分配的内存&#xff0c;导致这些内存无法被再次使用&#xff0c;从而造成系统内存的浪费。随着时间的推移&#xff0c;内存泄漏可能导致程序性能下降&#xff0c;甚至系统崩溃。…

sqli-labs时间盲注和布尔盲注

1、时间盲注和布尔盲注 在SQL注入攻击中&#xff0c;时间盲注&#xff08;Time-Based Blind SQL Injection&#xff09;和布尔盲注&#xff08;Boolean-Based Blind SQL Injection&#xff09;是两种常见的技术&#xff0c;用于在无法直接获取数据的情况下推断数据库信息。 2…

数据库脚本MySQL8转MySQL5

由于生产服务器版本上部署的是MySQL5&#xff0c;而开发手里的脚本代码是MySQL8。所以只能降版本了… 升级版本与降级版本脚本转换逻辑一样 MySQL5与MySQL8版本SQL脚本区别 大多数无需调整、主要是字符集与排序规则 MySQL5与MySQL8版本SQL字符集与排序规则 主要操作&…

Flutter 双屏双引擎通信插件加入 GitCode:解锁双屏开发新潜能

在双屏设备应用场景日益丰富的当下&#xff0c;移动应用开发领域迎来了新的机遇与挑战。如何高效利用双屏设备优势&#xff0c;为用户打造更优质的交互体验&#xff0c;成为开发者们关注的焦点。近日&#xff0c;一款名为 Flutter 双屏双引擎通信插件的创新项目正式入驻 GitCod…

Mysql进阶篇(mysqlcheck - 表维护程序)

mysqlcheck的作用 mysqlcheck客户端用于执行表维护&#xff0c;可以对表进行&#xff1a;分析、检查、优化或修复操作。 &#xff08;1&#xff09;分析的作用是查看表的关键字分布&#xff0c;能够让 sql 生成正确的执行计划&#xff08;支持 InnoDB&#xff0c;MyISAM&#x…

如何使用qt开发一个xml发票浏览器,实现按发票样式显示

使用Qt开发一个按发票样式显示的XML发票浏览器&#xff0c;如下图所示样式&#xff1a; 一、需求&#xff1a; 1、按税务发票样式显示。 2、拖入即可显示。 3、正确解析xml文件。 二、实现 可以按照以下步骤进行&#xff1a; 1. 创建Qt项目 打开Qt Creator&#xff0c;创…

Docker上安装Zabbix-server-mysql报错

创建新的zabbix server &#xff08;mysql&#xff09;容易&#xff0c;最后一条日志报错 cannot usedatabase"zabbix": its "users" table is empty (is this the Zabbix proxy database?) 往前还有一条关键报错信息 ERROR 1153 (08S01): Got a packe…

树和二叉树_13

树和二叉树_13 一、HZOJ-245二、题解1.引库2.代码 一、HZOJ-245 货仓选址 ​ 在一条数轴上有 N 家商店&#xff0c;他们的坐标分别为 A[1]−A[N]。现在需要在数轴上建立一家货仓&#xff0c;每天清晨&#xff0c;从货仓到每家商店都要运送一车商品。为了提高效率&#xff0c;求…

AI Agent有哪些痛点问题

AI Agent有哪些痛点问题 AI Agent领域有哪些知名的论文 目录 AI Agent有哪些痛点问题AI Agent领域有哪些知名的论文难以将自然语言与程序语言结合,跨平台兼容性差,缺乏有效的生产级干预机制具身 AI 在实现快速知识传播方面存在困难,难以从人类和 AI 专家中快速学习并实时模…