代码随想录 - 链表

news2025/2/25 13:59:10

总结概述

链表理论基础

链表是一种通过指针串联的线性结构,每一个节点由两部分组成,一个是数据域一个是指针域(存放指向下一个节点的指针),最后一个节点的指针域指向null(空指针的意思)。

链表的类型 

1、单链表 

单链表中的指针域只能指向节点的下一个节点。 

2、双链表

双链表:每一个节点有两个指针域,一个指向下一个节点,一个指向上一个节点。

双链表 既可以向前查询也可以向后查询。

3、循环链表

链表存储方式

链表是通过指针域的指针链接在内存中各个节点。

        所以链表中的节点在内存中不是连续分布的 ,而是散乱分布在内存中的某地址上,分配机制取决于操作系统的内存管理。

上图链表起始节点为2, 终止节点为7, 各节点分布在内存的不同地址空间上,通过指针串联。

链表的定义

// 单链表
struct ListNode {
    int val;  // 节点上存储的元素
    ListNode *next;  // 指向下一个节点的指针
    ListNode(int x) : val(x), next(NULL) {}  // 节点的构造函数
};

链表的操作

1、删除节点 

将C节点的next指针指向E节点就可以了。在C++里再手动释放这个D节点,释放这块内存。

2、添加节点 

可以看出链表的增添和删除都是O(1)操作,也不会影响到其他节点。

但是要注意,要是删除第五个节点,需要从头节点查找到第四个节点通过next指针进行删除操作,查找的时间复杂度是O(n)。

性能分析

数组在定义的时候,长度就是固定的,如果想改动数组的长度,就需要重新定义一个新的数组。

链表的长度可以不固定,并且可以动态增删, 适合数据量不固定,频繁增删,较少查询的场景。

203. 移除链表元素

解题思路及代码

链表操作的两种方式:

  • 直接使用原来的链表来进行删除操作。
  • 设置一个虚拟头结点在进行删除操作。

第一种操作:

直接使用原来的链表来进行移除

        在单链表中移除头结点 和 移除其他节点的操作方式是不一样,其实在写代码的时候也会发现,需要单独写一段逻辑处理移除头结点的情况。

class Solution {
public:
    ListNode* removeElements(ListNode* head, int val) {
        // 删除头结点
        while (head != NULL && head->val == val) { // 注意这里不是if
            ListNode* tmp = head;
            head = head->next;
            delete tmp;
        }

        // 删除非头结点
        ListNode* cur = head;
        while (cur != NULL && cur->next!= NULL) {
            if (cur->next->val == val) {
                ListNode* tmp = cur->next;
                cur->next = cur->next->next;
                delete tmp;
            } else {
                cur = cur->next;
            }
        }
        return head;
    }
};

第二种操作:

可以设置一个虚拟头结点,以一种统一的逻辑来移除

class Solution {
public:
    ListNode* removeElements(ListNode* head, int val) {
        ListNode* dummyHead = new ListNode(0); // 设置一个虚拟头结点
        dummyHead->next = head; // 将虚拟头结点指向head,这样方面后面做删除操作
        ListNode* cur = dummyHead;
        while (cur->next != NULL) {
            if(cur->next->val == val) {
                ListNode* tmp = cur->next;
                cur->next = cur->next->next;
                delete tmp;
            } else {
                cur = cur->next;
            }
        }
        head = dummyHead->next;
        delete dummyHead;
        return head;
    }
};
  • 时间复杂度: O(n)
  • 空间复杂度: O(1)

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

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

相关文章

SpringBoot自定义拦截器interceptor使用详解

Spring Boot拦截器Intercepter详解 Intercepter是由Spring提供的Intercepter拦截器,主要应用在日志记录、权限校验等安全管理方便。 使用过程 1.创建自定义拦截器,实现HandlerInterceptor接口,并按照要求重写指定方法 HandlerInterceptor接口源码&am…

4-5-tablewidget

文章目录 添加控件,添加行列数widget.cppwidget.h效果 添加控件,添加行列数 widget.cpp #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget) {ui->setupUi(this)…

PEFD-多投影蒸馏详细论文与代码解读(Improved Feature Distillation via Projector Ensemble)

论文链接:https://papers.nips.cc/paper_files/paper/2022/file/4ec0b6648bdf487a2f1c815924339022-Paper-Conference.pdf 源码链接:https://github.com/chenyd7/PEFD 文章目录 前言一、论文核心二、论文摘要三、论文内容四、集成投影方法五、源码环境安…

大厂急了,30+名企“报复性招人”

📢紧急通知!紧急通知! 2024届秋招已全面开启! 没错!你没听错!!!2024届秋招真的开始了,你还沉浸在暑假温柔乡,有些人已经拿到了offer!惊不惊喜意…

nodejs+vue+elementui小区物业管理系统_78ahx

课题主要分为四大模块:即管理员模块,物业管理模块、业主模块和维修员模块,主要功能包括:个人中心、物业管理、业主管理、维修员管理、小区公告管理、小区信息管理、房产信息管理、车位信息管理、停车位管理、停车信息管理、缴费信…

性能测试工具RunnerGo中如何管理接口

RunnerGo是一款基于go语言开发的开源测试平台,支持接口管理、自动化测试、性能测试等3大测试模块,今天给大家带来如何使用RunnerGo进行接口管理。 RunnerGo的接口管理类似于 Apipost,满足绝大多数接口管理需求。以下是使用 RunnerGo 进行接口…

储能pcb的布局注意事项与制造难点

随着新能源需求的不断增长和能源结构的转型,储能技术的市场规模不断扩大。储能PCB作为储能系统中电池模块的重要组成部分,对整个系统的安全性和性能起到关键作用。今天我们就来聊聊,储能pcb有什么特征。 什么是储能:储能是指能量…

封装Ellipsis组件,亲测使用各种场景

自己封装了Ellipsis组件 基于reacttaro,以下是实现代码,分为JSX和CSS文件 JSX代码如下: import { FC, Fragment, JSX, useState } from react; import { Image, StandardProps, Text, View } from tarojs/components;import iconDropDown fr…

2023年初中信息技术学科暑假备课

目录 2023年初中信息技术学科暑假备课1. 创意空间1.1 教师的空间1.2 学生的空间1.3 关于FTP服务器设置 2. 什么是编程2.1 编程语言2.2 人人都应学好编程2.3. 编程难吗?2.4 python用途 3. 开发环境3.1 打开IDLE3.2 IDLE窗口3.2.1 shell窗口和编辑窗口 4. 项目式教学4…

SysML V1.2 P1.概述

Scope SysML重用UML 2的子集,并提供额外的扩展来满足语言的需求。该规范根据UML 2中被重用的部分和UML 2的扩展,记录了语言体系结构。该规范包括完整语言的具体语法(符号),并指定UML 2的扩展。UML 2规范的可重用部分没有直接包含在规范中&…

解析Python面向对象:从小白到面向对象大师的蜕变之路

文章目录 一 类和对象的概念二 类的认识2.1 类的定义和使用语法2.2 成员变量和成员方法 三 类和对象3.1 类和对象的关系3.2 构造方法3.3 魔术方法概述(内置类方法)3.4 内置方法详解 四 面向对象三大特性4.1 封装4.1.1 封装的理解4.1.2 私有成员变量和方法…

致谢丨感谢有你,JumpServer开源项目九周年致谢名单

2014年到2023年,JumpServer开源项目已经走过了九年的时间。感谢以下社区贡献者对JumpServer项目的帮助和支持。 因为有你,一切才能成真。 JumpServer开源项目贡献者奖杯将于近日邮寄到以上贡献者手中,同时JumpServer开源项目组还准备了一份小…

2023年计算机科学与信息技术国际会议(ECCSIT 2023)

会议简介 Brief Introduction 2023年计算机科学与信息技术国际会议(ECCSIT 2023) 会议时间:2023年12月15日-17日 召开地点:中国北海 大会官网:www.eccsit.org 2023年计算机科学与信息技术国际会议(ECCSIT 2023)由国际电气、电子与能源工程协会…

Redis_哨兵模式

9. 哨兵模式 9.1 简介 当主库宕机,在从库中选择一个,切换为主库。 问题: 主库是否真正宕机?哪一个从库可以作为主库使用?如何实现将新的主库的信息通过给从库和客户端? 9.2 基本流程 哨兵主要任务: 监控选择主库通知 会有…

100个Java工具类之42:序列化工具类Apache之SerializationUtils

序列化工具类Apache之 org.apache.commons.lang3.SerializationUtils 众所周知:Java中序列化是指,将Java对象转换为可存储传输的字节序列的过程。 序列化作用: 1、网络传输:网络可以传输字节化的java对象 2、数据安全&#xf…

jQuery EasyUI datagrid 无记录时,增加“暂无数据“提示

我们只需要在onLoadSuccess中添加如下代码&#xff1a; if (data.total 0) {var body $(this).data().datagrid.dc.body2;body.find(table tbody).append(<tr><td width" body.width() " style"height: 35px; text-align: center;"><h…

20230811导出Redmi Note12Pro 5G手机的录音机APP的录音

20230811导出Redmi Note12Pro 5G手机的录音机APP的录音 2023/8/11 10:54 redmi note12 pro 录音文件 位置 貌似必须导出录音&#xff0c;录音的源文件不知道存储到哪里了&#xff01; 参考资料&#xff1a; https://jingyan.baidu.com/article/b87fe19e9aa79b1319356842.html 红…

以数据为中心的标记语言--yaml

&#x1f600;前言 本篇博文是关于以数据为中心的配置文件yaml的说明和应用&#xff0c;希望能够帮助到您&#x1f60a; &#x1f3e0;个人主页&#xff1a;晨犀主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是晨犀&#xff0c;希望我的文章可以帮助到大家&…

2023年电赛---运动目标控制与自动追踪系统(E题)—— 视觉部分

文章目录 一、前言二、视觉部分2.1&#xff1a;k210识别激光点2.2&#xff1a;k210识别方框和4个角点 三、总结 一、前言 &#x1f337;此次电赛我负责的部分主要是视觉&#xff0c;所以我着重和详细讲解一下视觉部分&#xff0c;不止限于此次电赛&#xff0c;而是从这次电赛视…

canfestival_主站发送同步对象触发主站PDO发送

1.入口处 2.开启定时器 3.调用定时器函数 4.切换到初始化状态&#xff0c;自动切换到预操作状态&#xff0c;最后进入操作状态 看到在预操作状态下&#xff0c;进行了通信状态的切换&#xff0c;调用相应的函数&#xff0c;如下&#xff1a; 5.调用开启SYNC的函数 查找对象字典…