【代码随想录 | Leetcode | 第五天】链表 | 移除链表元素 | 设计链表

前言

欢迎来到小K的Leetcode|代码随想录|专题化专栏,今天将为大家带来移除链表元素和设计链表的分享

目录

  • 前言
  • 203. 移除链表元素
  • 707. 设计链表
  • 总结


203. 移除链表元素

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

示例 1:

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

示例 2:

输入:head = [], val = 1
输出:[]

示例 3:

输入:head = [7,7,7,7], val = 7输出:[]

提示:

列表中的节点数目在范围 [0, 104] 内
1 <= Node.val <= 50
0 <= val <= 50

这个题目就是考察你熟悉不熟悉链表,有两种写法,第一种就是正常写,要考虑头结点的情况;第二种就是自己设定一个虚拟头结点,把两种情况转化为一种情况

方法一:考虑头结点的情况

class Solution {
public:ListNode* removeElements(ListNode* head, int val){//删除头结点while(head!=NULL&&head->val==val){ListNode* temp=head;head=head->next;delete temp;}//删除非头结点ListNode* cur=head;while(cur!=NULL&&cur->next!=NULL){if(cur->next->val==val){ListNode* temp=cur->next;cur->next=temp->next;delete temp;}else cur=cur->next;}return head;}
};

在这里插入图片描述

方法二:设定虚拟头结点,要注意的是最后要把头结点的指向改回来

class Solution {
public:ListNode* removeElements(ListNode* head, int val) {ListNode* virtualHead=new ListNode(0,head);ListNode* cur=virtualHead;while(cur!=NULL&&cur->next!=NULL){if(cur->next->val==val){ListNode* temp=cur->next;cur->next=temp->next;delete temp;}else cur=cur->next;}head=virtualHead->next;delete virtualHead,cur;return head;}
};

在这里插入图片描述

707. 设计链表

✨题目链接点这里

你可以选择使用单链表或者双链表,设计并实现自己的链表。
单链表中的节点应该具备两个属性:val 和 next 。val 是当前节点的值,next 是指向下一个节点的指针/引用。
如果是双向链表,则还需要属性 prev 以指示链表中的上一个节点。假设链表中的所有节点下标从 0 开始。

实现 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 的节点。

示例:

输入
["MyLinkedList", "addAtHead", "addAtTail", "addAtIndex", "get", "deleteAtIndex", "get"] [[], [1], [3], [1, 2], [1], [1], [1]]
输出
[null, null, null, null, 2, null, 3]

解释

MyLinkedList myLinkedList = new MyLinkedList();
myLinkedList.addAtHead(1);
myLinkedList.addAtTail(3);
myLinkedList.addAtIndex(1, 2);    // 链表变为 1->2->3
myLinkedList.get(1);              // 返回 2
myLinkedList.deleteAtIndex(1);    // 现在,链表变为 1->3
myLinkedList.get(1);              // 返回 3

提示:

0 <=index, val<= 1000
请不要使用内置的 LinkedList 库。
调用 get、addAtHead、addAtTail、addAtIndex 和 deleteAtIndex 的次数不超过 2000

可以说这五个接口,已经覆盖了链表的常见操作,是练习链表操作非常好的一道题目,说白了就是回忆链表的基本结构

class MyLinkedList {
public:struct LinkedNode{int val;LinkedNode* next;LinkedNode(int x):val(x),next(nullptr){}};MyLinkedList() {virtualHead=new LinkedNode(0);_size=0;}//注意index是从0开始的int get(int index){//非法直接返回-1if(index>(_size-1)||index<0) return -1;LinkedNode* cur=virtualHead->next;while(index--) cur=cur->next;return cur->val;}void addAtHead(int val) {LinkedNode* newNode=new LinkedNode(val);newNode->next=virtualHead->next;virtualHead->next=newNode;_size++;}void addAtTail(int val) {LinkedNode* newNode=new LinkedNode(val);LinkedNode* cur=virtualHead;while(cur->next!=NULL) cur=cur->next;cur->next=newNode;_size++;}void addAtIndex(int index, int val) {if(index>_size) return;if(index<0) index=0;LinkedNode* newNode=new LinkedNode(val);LinkedNode* cur=virtualHead;while(index--) cur=cur->next;newNode->next=cur->next;cur->next=newNode;_size++;}void deleteAtIndex(int index){if(index>=_size||index<0) return;LinkedNode* cur=virtualHead;while(index--) cur=cur->next;LinkedNode* temp=cur->next;cur->next=temp->next;delete temp;temp=nullptr;_size--;}
private:int _size;LinkedNode* virtualHead;
};

在这里插入图片描述

总结

本小节通过移除链表元素 | 设计链表两道题目回忆复习了链表的基本结构,开胃菜~✨

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

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

相关文章

【kubernetes系列】Kubernetes之配置dashboard安装使用

概述 Dashboard 是基于网页的 Kubernetes 用户界面。 你可以使用 Dashboard 将容器应用部署到 Kubernetes 集群中&#xff0c;也可以对容器应用排错&#xff0c;还能管理集群资源。 你可以使用 Dashboard 获取运行在集群中的应用的概览信息&#xff0c;也可以创建或者修改 Kub…

10.6.5 【Linux】分区命令: split

如果你有文件太大&#xff0c;导致一些携带式设备无法复制的问题&#xff0c;split可以将一个大文件&#xff0c;依据文件大小或行数来分区&#xff0c;可以将大文件分区成为小文件&#xff0c;快速有效。 将文件分区的话&#xff0c;使用-b size来将一个分区的文件限制其大小&…

java模拟MQTT客户端发送消息及EMQX配置

EMQX配置 登录地址 首先打开EMQX的管理界面&#xff0c;界面的地址如下&#xff0c; http://192.168.1.110:18083/ 规则是IP就是MQTT的IP&#xff0c;端口是固定的18083&#xff0c;输入该地址后&#xff0c;展示界面如下&#xff1a; 然后输入用户名和密码&#xff0c;用户…

python_day7_画图

json数据与python字典的相互转换 import json列表&#xff0c;其中每个元素均为一个字典 data [{"name": "张三", "age": 10},{"name": "李四", "age": 13},{"name": "jay", "age&qu…

科技云报道:数字化转型完成后,制造业如何走向“数智”时代?

科技云报道原创。 随着我国数字化转型行动的深入推进和智能制造工程的大力实施&#xff0c;制造业正朝着“数智”时代迈进&#xff0c;生成式AI被视为推动制造业智能化发展的关键驱动力。 据预测&#xff0c;到2027年&#xff0c;将有30%的制造业采用生成式AI来提升产品研发效…

汇编实现1-100累加(ARMv7)

汇编实现1-100累加 代码.text .globl _start _start:mov r0,#0 summationmov r1,#0 autoIncrementbl funadd funadd:cmp r1,#100addccs r0,r1,r0addccs r1,r1,#1mov pc,lr stop:b stop .end运行效果

【LangChain】数据连接(Data connection)

概要 许多LLM申请需要特定于用户的数据&#xff0c;这些数据不属于模型训练集的一部分。 LangChain 为您提供了通过以下方式加载、转换、存储和查询数据的构建块&#xff1a; Document loaders &#xff1a; 从许多不同来源加载文档Document transformers&#xff1a;拆分文档…

React native 已有项目升级兼容web

基础 概念 | webpack 中文文档 | webpack 中文文档 | webpack 中文网 深入理解Webpack及Babel的使用 - 掘金 Introduction to React Native for Web // React Native for Web Webpack 是一个现代的 JavaScript 应用程序的静态模块打包工具&#xff0c;它将应用程序所依赖的各…

Docker本地镜像发布到阿里云

我们构建了自己的镜像后&#xff0c;可以发布到远程镜像提供给其他人使用&#xff0c;比如发布到阿里云 使用build/commit生成新的镜像&#xff0c;并生成自己镜像的版本标签tag&#xff0c;此新的镜像在自己的本地库中&#xff0c;使用push可以将镜像提交到阿里云公有库/私有库…

确认应答机制与超时重发机制【TCP原理(笔记一)】

文章目录 通过序列号与确认应答提高可靠性正常的数据传输数据包丢失的情况确认应答丢失的情况发送的数据 重发超时如何确定 通过序列号与确认应答提高可靠性 在TCP中&#xff0c;当发送端的数据到达接收主机时&#xff0c;接收端主机会返回一个已收到消息的通知。这个消息叫做…

代码随想录算法训练营第十九天 | 动态规划系列5,6,7,8

动态规划系列5,6,7,8 377 组合总和 Ⅳ未看解答自己编写的青春版重点代码随想录的代码我的代码(当天晚上理解后自己编写) 爬楼梯进阶322 零钱兑换未看解答自己编写的青春版写完这道题后的感受重点代码随想录的代码动态规划&#xff0c;也要时刻想着剪枝操作。我的代码(当天晚上理…

通过SSH的方式连接Git仓库

前置条件 git已经安装。 生成公钥私钥 任意调出 git bash 执行&#xff1a; 回车两次&#xff0c;如果已有则需要覆盖确认 Overwrite ssh-keygen -t rsa -C "your_emailexample.com" 生成后的文件路径&#xff1a; C:/user/你的账户/.ssh下&#xff0c;其中 id…