数据结构——浅谈链表

article/2025/11/9 12:50:12

上午翻源码,翻到了原来学习数据结构时自己实现的链表源码,特此总结一下。源码可能有很多不完善的地方,请多谅解。


按照惯例,还是先来介绍下什么是链表。

链表是一种数据结构,在内存中通过节点记录内存地址而相互链接形成一条链的储存方式。相比数组而言,链表在内存中不需要连续的区域,只需要每一个节点都能够记录下一个节点的内存地址,通过引用进行查找,这样的特点也就造就了链表增删操作时间消耗很小,而查找遍历时间消耗很大的特点。

我们日常在Java中使用的LinkedList即为双向链表。而在链表是由其基本组成单元节点(Node)来实现的。我们在日常中见到的链表大部分都是单链表和双链表,在我前面文章中《数据机构——栈的基本总结》中,其中一个栈便是用单链表进行实现。这两种链表在实现思维上基本一致,只不过在插入、删除等操作实现上有所区别。

两种链表结构如图所示:

从图中可以看出,二者主要差别在于内部的Node类。单链表只需要一个指向下一个节点的引用Next,而双向链表则需要指向前一个Node的prev和下一个Node的Next。


单链表

在我们实现一个链表时,一定要主要引用的使用,如果一旦引用指向空,很可能再也取不到这些数据。因此,如果不缺的自己到底需要几个引用来指向不同的节点来实现不同的需求,可以多创建几个节点。

按照我的习惯,我一般会创建三个引用用于链表的各项操作。

  • theHeadPointer    头引用,始终指向链表头部,用于遍历链表,在头部增删数据等操作。
  • theLastPointer      尾引用,始终指向链表尾部,用于在尾部新增数据,同时可以用于删除数据。
  • theCurrentPointer 当前引用(也称哨兵引用),使用较为灵活,可以在操作数据时作为保险。

下图为单链表的数据操作步骤。

单链表的实现在这里就不详细用代码描述了,相信看完双链表再操作单链表会很熟练。


双向链表

在开头已经指出,二者最大的不同就是引用指向不同。实际上,在日常中,双向链表应用更加广泛,相比单链表,双向链表可从头尾两端进行遍历的特点非常具有优势,当我们需要查找最新的数据时,我们可从尾部开始遍历,需要查找旧数据时,从头部开始遍历,这样能大大减少遍历链表所需要的昂贵的花费。而单链表则只能从头部开始遍历。

下图为双向链表的操作.

双向链表的添加删除操作实现原理基本相同,只是在我们删除前,一定要保证删除节点的后一个节点有引用,否则很容易再也无法获得后面数据,为了防止这种情况,可以多创建几个引用,以防万一。下面就是自己实现双链表的代码。

为了节省空间,没有将Node类中Get和Set方法写出,大家理解一下。

public class DoubleLinkedListNode {//数据 private Object element;// 前指针private DoubleLinkedListNode pre;// 后指针private DoubleLinkedListNode next;public DoubleLinkedListNode(DoubleLinkedListNode pre, Object element, DoubleLinkedListNode next) {this.element = element;this.pre = pre;this.next = next;}
}

下面就是链表实现

package MyLinkedList;public class DoubleLinkedList {/** 双向链表中我们要实现插入,删除,查找等操作*///头节点private DoubleLinkedListNode theHeadNode = null;//头引用,用于获得内存中的数据private DoubleLinkedListNode theHeadPointer;//当前节点引用private DoubleLinkedListNode currentPointer;//新建节点引用private DoubleLinkedListNode newPointer;//删除节点引用private DoubleLinkedListNode removePointer;//查找节点引用private DoubleLinkedListNode selectPointer;//节点计数器private int size = 0;public DoubleLinkedListNode remove(Object element) {//删除操作,删除特定数据while(element.equals(removePointer.getElement()) == false) {removePointer = removePointer.getNext();			}removePointer.getPre().setNext(removePointer.getNext());removePointer.getNext().setPre(removePointer.getPre());return removePointer;}public int insert(Object element) {//插入操作if(theHeadNode == null && size == 0) {//将头节点实例化,并将头指针指向头节点,节点计数器自增theHeadNode = new DoubleLinkedListNode(null, element, null);theHeadPointer = theHeadNode;size++;return 1;}else if(theHeadNode != null) {//创建的新节点,该节点前引用指向currentPointernewPointer = new DoubleLinkedListNode(currentPointer, element, null);currentPointer.setNext(newPointer);//将当前节点设置为新建的节点currentPointer = newPointer;size++;return 1;}else {return 0;}}public boolean select(Object element) {//查找操作while(element.equals(selectPointer.getElement()) == false) {selectPointer = selectPointer.getNext();if(element.equals(selectPointer.getElement()) == true) {return true;}}return false;}public int size() {//判断链表内元素个数return size;}public boolean isEmpty() {//判断链表是否为空if(theHeadNode == null) {return true;}else {return false;}}}

从代码中可见,我用了非常多的引用,因为当时在写的时候,逻辑还是不是很清晰,这样起码能保证数据不会丢失,当然一定会有更简单多的方法,大家可以分享出来。

请大家多多指出错误,共同进步!


http://chatgpt.dhexx.cn/article/pqZdBrmj.shtml

相关文章

数据结构:链表-C语言实现

文章目录 链表一. 前言二. 链表的定义2.1 概念2.2 分类 三. 单向无头不循环链表3.1 概念和说明3.2 定义链表结构体3.3 函数接口3.3.1 申请节点3.3.2 链表头插3.3.3 链表尾插3.3.4 在pos节点之后插入3.3.5 在pos节点之前插入3.3.6 链表头删3.3.7 链表尾删3.3.8 删去pos节点3.3.9…

数据结构——链表

数组是常用的数据结构,但是有其局限性: 编译期需要确定元素大小 数组在内存中是连续的,插入或者删除需要移动数组中其他数据 数组适合处理确定长度的,对于插入或者删除不敏感的数据。如果数据是频繁变化的,就需要选择…

数据结构-链表

链表 一、介绍1、单链表1、单链表结构体:2、单链表头插法:3、单链表尾插法: 二、例题1、双指针(获取倒数第K个元素、获取中间位置的元素、判断链表是否存在环、判断环的长度、查找第一个公共节点、回文链表)1、 判断链…

C语言数据结构、十字链表的分析及实现

目录 前言 一、什么是十字链表 二、认识十字链表 1.十字链表的组成 2.顶点和弧的连接 三、代码逻辑实现 1.出度 2.入度 总结 前言 无论是什么程序都要和数据打交道,一个好的程序员会选择更优的数据结构来更好的解决问题,因此数据结构的重要性不言…

JS 数据结构:链表

单链表 每个节点中只包含一个指针域的链表称为单链表。 头结点—其指针域指向表中第一个结点的指针(头结点不是必须的,只是习惯上加上头结点,而头结点的数据域一般记录的是该链表的相关数据,如:链表长度)…

数据结构中链表和列表的区别

顺序表和链表由于存储结构上的差异,导致它们具有不同的特点,适用于不同的场景。通过系统地学习顺序 表和链表我们知道,虽然它们同属于线性表,但数据的存储结构有本质的不同。 • 顺序表存储数据,需预先申请一整块足够…

数据结构(六)——循环链表

一、循序链表简介 1、循环链表的定义 循环链表的任意元素都有一个前驱和一个后继,所有数据元素在关系上构成逻辑上的环。 循环链表是一种特殊的单链表,尾结点的指针指向首结点的地址。 循环链表的逻辑关系图如下: 2、循环链表的设计实现 …

数据结构-使用链表实现栈

目录结构 Stack接口 package LinkedListStack;public interface Stack<E> {int getSize();boolean isEmpty();void push(E e); //向栈中添加元素E pop();//向栈中取出元素E peek();//查看栈顶的元素 }LinkedList类 package LinkedListStack;public class LinkedList<…

数据结构 | 链表的实现

目录 单链表双链表数组结构和链式结构的对比 线性表中&#xff0c;除了顺序表这一重要的结构&#xff0c;还有链式结构&#xff0c;而这也是我们常说的链表。 一般是通过定义结构体(类)的方式来表示链表的每一个结点。一般而言&#xff0c;链表的结点都会有数据域和地址域。数据…

Java数据结构之链表

目录 一.单链表 1.单链表的介绍和内存布局 2.单链表的添加和遍历 3.单链表的插入 4.单链表的删除 二.双向链表 1.添加节点 2.遍历节点 3.插入节点 4.删除结点 5.测试 三.单向环形链表 1.问题的引出 ​编辑 2.构建环形链表 1.创建结点 3.测试 3.约瑟夫问题代码的…

c++数据结构:链表

链表是一种物理存储单元上非连续、非顺序的存储结构&#xff0c;数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点&#xff08;链表中每一个元素称为结点&#xff09;组成&#xff0c;结点可以在运行时动态生成。每个结点包括两个部分&#xff1a;一个是…

java数据结构-链表详解

文章目录 1.数据结构-链表详解1.1单链表1.1.1单链表节点的尾部添加1.1.2单链表节点的自动排序添加1.1.3单链表节点的修改1.1.4单链表节点的删除 1.2单链表面试题1.2.1单链表的有效节点个数1.2.2单链表倒数第k个结点1.2.3单链表反转1.2.4单链表逆序打印 1.3双向链表1.3.1双向链表…

C语言数据结构链表(图文)

目录 一、链表的简单理解与引入 1.1 链表的引入 1.2 节点的理解 1.3 链表的分类 二、常用链表功能的实现 2.1 首先是节点的定义&#xff0c; 2.2 节点的创建 2.3 单链表的尾插 2.4 单链表的尾删 2.5 单链表的头插 2.6 链表的头删 2.7 单…

【数据结构】链表的学习总结

目录 1.链表的概念2.链表的结构1️⃣链表中单个结点的结构2️⃣链表的整体结构 3.链表的分类4.链表的实现1️⃣单向无头非循环2️⃣双向带头循环 1.链表的概念 链表&#xff0c;是一种物理存储结构上非连续、非顺序的存储结构&#xff0c;数据元素的逻辑顺序是通过链表 中的指针…

C++数据结构之链表(详解)

主要参考文章地址 01.链表基础知识 | 算法通关手册 (itcharge.cn)&#xff09; 本次内容是对链表的总结&#xff0c;可以看了上面的文章之后。 在看我下面的内容&#xff0c;做一个简短的复习&#xff0c;且本内容的代码均用C实现&#xff0c;而参考资料的代码则为python。 …

[数据结构]链表之单链表(详解)

文章目录 [数据结构]链表之单链表前言1.链表1.1链表的概念及结构1.2单链表与顺序表的区别与优缺点1.3八种链表类型、单向带头循环链表单向带头非循环链表单向不带头循环链表单向不带头非循环链表双向带头循环链表双向带头非循环链表双向不带头循环链表双向不带头非循环链表 2.单…

【数据结构与算法】详解什么是链表,并用代码手动实现一个链表结构

本系列文章【数据结构与算法】所有完整代码已上传 github&#xff0c;想要完整代码的小伙伴可以直接去那获取&#xff0c;可以的话欢迎点个Star哦~下面放上跳转链接 https://github.com/Lpyexplore/structureAndAlgorithm-JS 本文将来讲解一下一种常见的线性数据结构—链表&a…

数据结构-链表篇

数据结构中数组和链表是是使用频率最高的基础数据结构。数组作为数据存储结构有一定的缺陷。在无序数组中&#xff0c;搜索性能差&#xff0c;在有序数组中&#xff0c;插入效率又很低&#xff0c;而且这两种数组的删除效率都很低&#xff0c;并且数组在创建后&#xff0c;其大…

数据结构之——链表

目录 一、链表的概念及结构 二、单链表的实现&#xff08;无头单向非循环链表&#xff09; 1.单链表节点定义 2.单链表的接口实现 &#xff08;1&#xff09;动态申请一个节点 &#xff08;2&#xff09;单链表打印 &#xff08;3&#xff09;单链表的销毁 &#xff0…

【数据结构】链表

单链表 这张图是我们待会要实现的功能&#xff0c;我会尽可能的将每一步都说的很详细&#xff0c;方便理解。 链表的概念及结构 概念&#xff1a;链表是一种 物理存储结构上非连续 、非顺序的存储结构&#xff0c;数据元素的 逻辑顺序 是通过链表中的 指针链 接 次序实现的 。…