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

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

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

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

单向链表:

一个单链表的节点分为两部分:数据域(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 指针并且值为nullhead = 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.xdnf.cn/news/140653.html

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

相关文章

更换YUM源

前言 yum -y install pcre-develCannot find a valid baseurl for repo: base/7/x86_64更换yum源 备份 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak下载yum源 这次选择阿里 阿里yum源仓库 替换更新 mv ~/Centos-7.repo /etc/yum.repos…

黑神话悟空:上架27天后,玩家群体分析

按9月13日的统计&#xff0c;仅在steam平台上&#xff0c;售出1900w份&#xff0c;约65亿人民币。 &#xff08;游戏于2024年8月20日发售&#xff09; 由于黑神话的关卡是线性的&#xff0c;即必须一关打过才能打下一关&#xff0c;和游戏的成就系统对应&#xff0c;所以可以…

【免费】CISSP官方习题集第4版

伴随2004年4月CISSP新大纲发布&#xff0c;CISSP官方习题集第4版(OPT v4)已于2024年5月出版&#xff1a; 本人维护的中英对照8个知识域分章节练习已同步更新完成&#xff0c;在保持v3版内容基础上&#xff0c;增补了所有v4新内容&#xff0c;免费供考友们使用&#xff0c;访问方…

漏洞复现-泛微-E-Cology-SQL

更多漏洞分析复现&#xff0c;可前往无问社区查看http://www.wwlib.cn/index.php/artread/artid/10358.html 0x01 产品简介 泛微e-cology是一款由泛微网络科技开发的协同管理平台&#xff0c;支持人力资源、财务、行政等多功能管理和移动办公。 0x02 漏洞概述 泛微e-cology…

通信工程学习:什么是UNI用户网络接口

UNI&#xff1a;用户网络接口 UNI&#xff08;User Network Interface&#xff09;用户网络接口&#xff0c;是网络通信中的一个重要概念&#xff0c;它连接了用户设备与智能光网络或其他类型的网络。以下是关于UNI用户网络接口的详细解释&#xff1a; 一、定义与功能 定义&am…

YOLO学习笔记 | YOLO目标检测算法(YOLO-V2)

github&#xff1a;https://github.com/MichaelBeechan CSDN&#xff1a;https://blog.csdn.net/u011344545 YOLO-V2 V1与V2区别Batch Normalization更大分辨率YOLO-V2网络结构 V1与V2区别 V2更强更快 Batch Normalization 更大分辨率 YOLO-V2网络结构

类的定义和对象的使用

类的定义 类名&#xff1a;手机(Phone) 成员变量&#xff1a;品牌(brand&#xff09;&#xff0c;价格&#xff08;price&#xff09; 成员方法&#xff1a;打电话(calL)&#xff0c;发短信&#xff08;sendMessage&#xff09; 调用类变量和方法

一键智能改写文章,快速提升内容的吸引力

在这个信息如潮水般涌来的时代&#xff0c;优质的内容创作成为了吸引眼球、传递价值的关键。而有时候&#xff0c;我们可能会面临着已有文章需要优化、旧内容需要焕发新活力的情况。此时&#xff0c;一键智能改写文章的工具就如同一位神奇的魔法师&#xff0c;它能帮助我们将文…

【Linux】调试和Git及进度条实现

这里是阿川的博客&#xff0c;祝您变得更强 ✨ 个人主页&#xff1a;在线OJ的阿川 &#x1f496;文章专栏&#xff1a;Linux入门到进阶 &#x1f30f;代码仓库&#xff1a; 写在开头 现在您看到的是我的结论或想法&#xff0c;但在这背后凝结了大量的思考、经验和讨论 目录 1.…

(CVPR-2022)感知优先的扩散模型训练

感知优先的扩散模型训练 Paper Title&#xff1a;Perception Prioritized Training of Diffusion Models Paper是首尔国立大学数据科学与人工智能实验室发表在CVPR 2022的工作 论文地址 Code地址 Abstract 扩散模型通过优化相应损失项的加权和&#xff08;即去噪得分匹配损失&…

危机中的机遇:客户服务在品牌危机管理中的角色与价值

在瞬息万变的商业环境中&#xff0c;品牌危机如同暗流涌动的漩涡&#xff0c;随时可能将企业卷入深渊。然而&#xff0c;正如古语所云&#xff1a;“祸兮福之所倚”&#xff0c;危机之中往往也蕴藏着转机与机遇。在这一过程中&#xff0c;客户服务作为企业与消费者之间的桥梁&a…

react js 使用 useEffect 钩子

起因&#xff0c; 目的: useEffect() &#xff0c; 已经遇见好几次了。 我的理解是&#xff0c; 页面加载完成之后&#xff0c;会执行这个函数。&#xff1f;&#xff1f;&#xff1f; 写个例子&#xff0c; 请求 api import React, { useState, useEffect } from "re…

【C++】STL--string(上)

前言 C语言中&#xff0c;字符串是以\0结尾的一些字符的集合&#xff0c;为了操作方便&#xff0c;C标准库中提供了一些str系列的库函数&#xff0c;但是这些库函数与字符串是分离开的&#xff0c;不太符合OOP的思想&#xff0c;而且底层空间需要用户自己管理&#xff0c;稍不留…

numpy手写二分类交叉熵

下面是一个使用NumPy手写二分类交叉熵损失的代码&#xff0c;包括详细注释。我们将定义一个简单的函数来计算交叉熵损失&#xff0c;并使用main函数来演示如何使用它。 import numpy as npdef binary_cross_entropy(y_true, y_pred):"""计算二分类交叉熵损失参…

莎朗斯通的比基尼视频曝光了她的日常锻炼!自爆曾在重症监护室呆了9天

如果您错过了&#xff0c;莎朗斯通 (Sharon Stone) 的华丽比基尼视频向您展示了她的日常锻炼&#xff01; 9 月 12 日&#xff0c;斯通分享了一段她在泳池里锻炼的视频。她分享了这段视频&#xff0c;并配文&#xff1a;“我刚刚和教练 kristinemarie_18 完成了最后一次锻炼&a…

Python酷库之旅-第三方库Pandas(104)

目录 一、用法精讲 451、pandas.DataFrame.pow方法 451-1、语法 451-2、参数 451-3、功能 451-4、返回值 451-5、说明 451-6、用法 451-6-1、数据准备 451-6-2、代码示例 451-6-3、结果输出 452、pandas.DataFrame.dot方法 452-1、语法 452-2、参数 452-3、功能…

MyBatis中多对一关系的三种处理方法

目录 MyBatis中多对一关系的三种处理方法 1.通过级联属性赋值 1&#xff09;mapper 2&#xff09;mapper.xml 3&#xff09;测试代码 4&#xff09;测试结果 2.通过标签 1&#xff09;mapper 2&#xff09;mapper.xml 3&#xff09;测试代码 4&#xff09;测试结果 3.分步查询 …

Golang | Leetcode Golang题解之第405题数字转换为十六进制数

题目&#xff1a; 题解&#xff1a; func toHex(num int) string {if num 0 {return "0"}sb : &strings.Builder{}for i : 7; i > 0; i-- {val : num >> (4 * i) & 0xfif val > 0 || sb.Len() > 0 {var digit byteif val < 10 {digit 0…

kettle从入门到精通 第八十五课 ETL之kettle kettle中javascript步骤调用外部javascript/js文件

场景&#xff1a;交流学习群里面有小伙伴咨询kettle中的javascript代码步骤如何调用外部js文件中的函数&#xff0c;觉得有点意思的&#xff0c;于是就抽时间整理了一下。 1、外部js文件为test.js&#xff0c;代码如下&#xff1a; function test(param){return "接收到了…

估值1500亿美元!OpenAI据称正洽谈新一轮融资 | LeetTalk Daily

“LeetTalk Daily”&#xff0c;每日科技前沿&#xff0c;由LeetTools AI精心筛选&#xff0c;为您带来最新鲜、最具洞察力的科技新闻。 OpenAI作为全球领先的人工智能研究机构之一&#xff0c;近期宣布计划以1500亿美元的投前估值融资65亿美元&#xff0c;这一消息引发了广泛的…