数据结构——链表(短小精悍版)

news2024/9/19 21:53:42

使用链表结构可以克服数组链表需要预先知道数据大小的缺点

链表结构可以充分利用计算机内存空间,实现灵活的内存动态管理。

但是链表失去了数组随机读取的优点同时链表由于增加了结点的指针域,空间开销比较大。

单向链表:

一个单链表的节点分为两部分:数据域(data)和指针域(next)

数据域用来保存信息,指针域用来指向下一个节点的地址

单向链表查询较慢: 查找时需要从第一个节点开始一直访问到需要的位置

插入快

删除快:删除只需要将删除结点的上一个指针指向删除节点的下一个节点。

单向链表插入的三种方法:
1.头插法:
  • 将新节点的 next 指针指向当前的头节点。
  • 更新头节点指针为新节点。
public void insertAtHead(int data) {
    Node newNode = new Node(data);
    newNode.next = head;
    head = newNode;
}
2.尾插法
  • 如果链表为空(只有一个 head 指针并且值为null),直接将头节点指针指向新节点。
  • 链表不为空,遍历到链表的最后一个节点,将其 next 指针指向新节点。
public void insertAtTail(int data) {
    Node newNode = new Node(data);
    if (head == null) {//只有一个 head 指针并且值为null
        head = newNode;
        return;
    }
    Node current = head;
    while (current.next != null) {
        current = current.next;
    }
    current.next = newNode;
}
3.插入到链表的指定位置
  • 遍历到插入位置的前一个节点(位置从0开始计数)。
  • 将新节点的 next 指针指向当前节点的 next
  • 更新当前节点的 next 指针为新节点。
public void insertAtPosition(int data, int position) {
    if (position < 0) {
        throw new IndexOutOfBoundsException("Position cannot be negative");
    }
    if (position == 0) {
        insertAtHead(data);
        return;
    }
    Node newNode = new Node(data);
    Node current = head;
    for (int i = 0; i < position - 1 && current != null; i++) {
        current = current.next;
    }
    if (current == null) {
        throw new IndexOutOfBoundsException("Position out of bounds");
    }
    newNode.next = current.next;
    current.next = newNode;
}

双向链表:

双向链表的指针域有两个指针,分别指向直接后继和直接前驱。

双向链表可以从前向后遍历也可以从后向前遍历

typedef int LTDataType;
typedef struct ListNode
{
	struct ListNode* next;     //后继节点
	struct ListNode* prev;      //前驱节点
	LTDataType data;
 
}LTNode;
当双向链表为空时:

双向链表头插法:

对于每个元素,创建一个新结点,并将其插入到头结点之后,使新结点成为新的头结点。

最后创建成功的双链表的顺序和输入的顺序相反,即为逆序的。

头插法的时间复杂度为O(1)。

//利用头插法创建双链表
DLinkList Init_DLinkList_head() {
    DLinkList head = (DLinkList) malloc(sizeof(DLinkList));
    head->prior = NULL;
    head->next = NULL;
    head->data = NULL;
 
   bool List_Insert (DLinkList pHead,int e){
   DNode* newNode = (DNode *)malloc(sizeof(DNode));
       newNode->data = e;
       
        newNode->next =  pHead->next;  //head的后继赋给新节点的后继
        pNode->prior = pHead;          //头节点指向新节点
       if(pHead->next !=NULL){
           pHead->next->prior = newNode;
       }
       pHead->next= newNode;
       return true;
   }
}
双向链表尾插法:

对于每个元素,创建一个新结点,并将其插入到头结点之后的尾部,更新尾结点的next指针和新结点的prior指针。遍历完成后,返回头结点的next指针,即为新链表的头结点。

尾插法的时间复杂度为O(n),因为需要遍历整个双链表找到尾节点。

//利用尾插法创建双链表
DLinkList Init_DLinkList_tail() {
    DLinkList head = (DLinkList) malloc(sizeof(DLinkList));
    head->prior = NULL;
    head->next = NULL;
    head->data = NULL;
    
 

    void addLast(DLinkList pHead,int e){
        DNode* newNode = (DNode *)malloc(sizeof(DNode));
        newNode->data = e;
    }
     DNode* last = pHead;
    //遍历链表找到最后一个节点
    while(last->next !=NULL){
    last = last->next;
    }
    //让最后一个结点的后继指向新节点,新节点的后继指针置空
    last->next = newNode;
    newNode->prior = last;
     newNode->next = NULL;
}

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

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

相关文章

MiniCPM3-4B | 笔记本电脑运行端侧大模型OpenBMB/MiniCPM3-4B-GPTQ-Int4量化版 | PyCharm环境

MiniCPM3-4B&#xff0c;轻松在笔记本电脑上运行大模型&#xff1f; 背景一、选择模型二、模型下载三、模型运行四、总结 背景 2024年9月5日&#xff0c;面壁智能发布了MiniCPM3-4B&#xff0c;面壁的测试结果声称MiniCPM3-4B表现超越 Phi-3.5-mini-instruct 和 GPT-3.5-Turbo-…

MSF的使用学习

一、更新MSF apt update # 更新安装包信息&#xff1b;只检查&#xff0c;不更新&#xff08;已安装的软件包是否有可用的更新&#xff0c;给出汇总报告&#xff09; apt upgrade # 更新已安装的软件包&#xff0c;不删除旧包&#xff1b; apt full-upgrade # 升级包&#x…

HashMap高频面试知识点

HashMap HashMap是基于hash表的一种数据结构&#xff0c;用于存放键值对&#xff0c;核心就是把hash值映射到数组的索引位&#xff0c;通过数组链表&#xff08;JDK1.8开始通过数组链表红黑树&#xff09;解决Hash冲突。 因为当hash冲突较多时&#xff0c;链表中元素增加&#…

C语言进阶【4】---数据在内存中的存储【1】(你不想知道数据是怎样存储的吗?)

本章概述 整数在内存中的存储大小端字节序和字节序判断练习1练习2练习3练习4练习5练习6 彩蛋时刻&#xff01;&#xff01;&#xff01; 整数在内存中的存储 回忆知识&#xff1a;在讲操作符的那章节中&#xff0c;对于整数而言咱们讲过原码&#xff0c;反码和补码。整数分为有…

JAVA同城生活新引擎外卖跑腿团购到店服务多合一高效系统小程序源码

&#x1f680;同城生活新风尚&#xff01;一站式高效系统&#xff0c;让日常更便捷&#x1f6cd;️ &#x1f37d;️【开篇&#xff1a;同城生活&#xff0c;一触即发】&#x1f37d;️ 在这个快节奏的时代&#xff0c;同城生活的便利性与效率成为了我们追求的新风尚。想象一下…

C++ —— 关于vector

目录 链接 1. vector的定义 2. vector的构造 3. vector 的遍历 4. vector 的扩容机制 5. vector 的空间接口 5.1 resize 接口 5.2 push_back 5.3 insert 5.4 erase 5.5 流插入与流提取 vector 并不支持流插入与流提取&#xff0c;但是可以自己设计&#xff0c;更…

[NSSCTF 2022 Spring Recruit]ezgame

打开题目环境是一个游戏: 直接F12开始审计源代码&#xff1a; 这里说拿到65分以后可以得到flag&#xff0c;这里因为游戏太菜选择直接篡改分数&#xff1a; 在控制台输入scorePoin10000就可以改变当次得分&#xff0c;等到游戏结束就能得到flag。

心觉:成功学就像一把刀,有什么作用关键在于使用者(二)

Hi&#xff0c;我是心觉&#xff0c;与你一起玩转潜意识、脑波音乐和吸引力法则&#xff0c;轻松掌控自己的人生&#xff01; 挑战每日一省写作174/1000天 上一篇文章讲了成功学到底是个啥 是如何起作用的 为什么有些人觉得没有用&#xff1f; 今天我们再展开来剖析一下这…

链表--(1)链表的概念

前言引入 之前我们学习了数组这一概念,使用数组可以在编程时增加程序的灵活性。但在c语言中不允许定义动态数组的类型也不能随意调整数组的大小,往往会导致内存空间的浪费。由此我们推出链表。链表是动态进行内存分配的一种结构,它可以随时为其结点分配需要的存储空间也方便…

Vscode搭配latex简易教程

1. 找镜像网站下载texlive的iso文件 清华源镜像 下载之后直接打开iso文件&#xff0c;打开install-tl-windows.bat文件&#xff0c;进行安装即可&#xff0c;安装大概30分钟左右 2. VScode端配置 2.1 下载这三个插件 2.2 打开设置 2.3 追加内容到配置json文件当中 // Latex…

《深入理解JAVA虚拟机(第2版)》- 第12章 - 学习笔记

第12章 Java内存模型与线程 12.1 概述 TPS是用来衡量一个服务性能好坏高低的重要指标值。TPS是Transactions Per Second的缩写&#xff0c;用来表示每秒事务处理数&#xff0c;即服务端每秒平均能碰响应的请求数。 12.2 硬件的效率与一致性 处理器与内存的运算效率差了好几…

使用阿里OCR身份证识别

1、开通服务 免费试用 2、获取accesskay AccessKeyId和AccessKeySecret 要同时复制保存下来 因为后面好像看不AccessKeySecret了 3.Api 参考 https://help.aliyun.com/zh/ocr/developer-reference/api-ocr-api-2021-07-07-recognizeidcard?spma2c4g.11186623.0.0.7a9f4b1e5C…

园区网基础组网保姆级(mstp,vrrp,irf,eth-trunk,route-policy,ospf,bgp,rbm,nat,mlag等等)

本文实验使用模拟器:H3C HCL 5.10.2版本 一、园区核心/接入架构1.1.三层架构1.2.二层架构二、园区核心 To 接入实践2.1.MSTP+VRRP派系2.1.1.MSTP+VRRP配置2.1.2.MSTP+VRRP验证2.2.IRF+Eth-Trunk派系2.2.1.IRF+Eth-Trunk配置2.3.两种派系的对比2.4.VXLAN结构三、园区核心/出口架…

观《中国数据库前世今生》有感:从历史中汲取未来的力量

观《中国数据库前世今生》有感&#xff1a;从历史中汲取未来的力量 中国数据库技术的起步与发展 观看了《中国数据库前世今生》后&#xff0c;我对于中国数据库技术的历史变迁有了更深刻的理解。作为一名有一年开发经验的程序员&#xff0c;这部纪录片让我对中国数据库行业从8…

828华为云征文 | 云服务器Flexus X实例,搭建上线前后端项目

828华为云征文 | 云服务器Flexus X实例&#xff0c;搭建上线前后端项目 项目搭建 演示使用华为云服务器Flexus X实例搭建上线前后端项目黑马vue电商后台管理系统 项目GitHub链接&#xff1a;https://github.com/Minori-ty/vue_shop.git 1、购买华为云 Flexus X 实例 Flexus云服…

.Net Core 生成管理员权限的应用程序

创建一个ASP.NET Core Web API项目 给解决方案设置一个名称 选择一个目标框架&#xff0c;这里选择的是 .NET 8.0框架 在Porperties文件夹中添加一个app.manifest文件 设置app.manifest文件属性&#xff0c;生成操作设置为嵌入的资源 双击解决方案名称&#xff0c;编辑WebAppli…

JS实现树形结构数据中特定节点及其子节点显示属性设置的技巧(可用于树形节点过滤筛选)

大家好&#xff0c;今天我要分享的是如何在树形结构的数据中&#xff0c;根据特定条件设置节点及其所有子节点的显示属性。在实际项目中&#xff0c;这种需求非常常见&#xff0c;特别是在需要动态展示和隐藏节点的情况下。下面我将通过一个具体的示例来讲解实现过程。 需求分析…

(史上最全)线程池

线程池 文章目录 线程池一&#xff0c;前言二&#xff0c;线程池三&#xff0c;参数四&#xff0c;线程池的实现原理5.线程池的使用案例(自定义线程池)6.使用Executors 创建常见的功能线程池1.固定大小线程池2.定时线程3.可缓存线程池4.单线程化线程池 一&#xff0c;前言 虽然…

Prometheus 上手指南

文章目录 Prometheus 相关概念Prometheus 的特点Prometheus 架构数据模型 Datemode使用场景 指标类型 Metric type适用场景 作业和实例 Jobs and instances使用场景 Prometheus 安装Prometheus 配置prometheusalertmanager Grafana 可视化Grafana 安装Grafana 配置选项Grafana …

假期学习--iOS 编译链接

iOS 编译链接 编译流程 四步&#xff1a; 1.预处理 2.编译 3.汇编 4.链接 大概的步骤如下&#xff1a; 预处理 作为编译的第一步&#xff0c;将.m文件转换为.i文件 &#xff1b; 预处理是要处理源代码中所有以#开头的所有预编译指令 &#xff1b; 规则如下&#xff1…