当前位置: 首页 > news >正文

数据结构-链表

数据结构-链表

一、什么是链表?

链表是一种常见的数据结构,由一系列节点构成,每个节点包含当前节点的数据和一个指针(单向链表)或者两个指针(双向链表),链表是一种动态的数据结构,可以动态的增删节点。它的特点是插入与删除数据十分方便,但寻找与读取数据的表现欠佳。

二、链表的特点

动态内存分配:链表中的节点是在运行时动态创建的,可以根据需要分配和释放内存。
可扩展性:链表的大小可以根据需要动态增长或缩小,没有固定的大小限制。
非连续存储:链表中的节点可以分散在内存的不同位置,每个节点包含数据和指向下一个节点的指针

三,单向链表

在线性表中,每个元素最多只有一个前驱结点和后继结点,采样链式存储时,每个结点需要包含前驱结点或者后继结点的地址信息,其中最简单也是最常用的方法是只存储每个结点的后继结点的地址,以这种方式构成的链表称为单链表。每个结点同时包含前驱节点和后继结点的地址构成的链表称为双链表
在这里插入图片描述

链表它是由一个一个节点连接起来的。每一个节点里面有两个值,data存放的是数据,next存放的是 下一个节点的地址。

以下是一个简单的 Java 实现的单链表。这个实现包括基本的操作,如添加节点、显示链表和查找节点。

//节点类
class Node {int data;  // 节点数据Node next; // 指向下一个节点的引用// 构造函数Node(int data) {this.data = data;this.next = null;}
}
//单链表类
class SinglyLinkedList {private Node head; // 链表头部// 构造函数public SinglyLinkedList() {head = null;}// 添加节点到链表尾部public void append(int data) {Node newNode = new Node(data);if (head == null) {head = newNode;//如果链表为空,插入的数据为头结点} else {Node current = head;//头结点赋值给currentwhile (current.next != null) {//当当前节点的下一个指向不为空时,继续循环current = current.next;}//直到下一个节点为空,current.next = newNode;//插入数据}}// 显示链表public void display() {Node current = head;//头结点赋值给currentwhile (current != null) {//当节点不为空的时候,进入循环输出System.out.print(current.data + " -> ");current = current.next;//改变节点到下一个节点}System.out.println("null");}// 查找节点public boolean find(int data) {Node current = head;//头结点赋值给currentwhile (current != null) {if (current.data == data) {//当所要查找的data和链表中的current.data对应时,返回return true;}current = current.next;//当不对应时,继续下一个}return false;}
}
//单链表测试类
public class LinkedListTest {public static void main(String[] args) {SinglyLinkedList list = new SinglyLinkedList();// 添加节点list.append(10);list.append(20);list.append(30);// 显示链表list.display();// 查找节点System.out.println("查找20: " + list.find(20));System.out.println("查找40: " + list.find(40));}
}

四,双向链表

双向链表中同样有数据域和指针域。不同之处在于,指针域有左右(或上一个、下一个)之分,用来连接上一个结点、当前结点、下一个结点。

每个结点存在两个指针域,分别存储该结点的前驱结点引用和后继结点引用,从任意一个结点出发,都能通过前驱引用以及后继引用完成整个链表结点的访问。

所以不难看出,单向链表能干的事,双向链表也能干!但是正是因为这一特性,相比于单链表,双向链表在访问其他结点上带来方便的同时,将占用更多的资源,因此在使用的时候可以根据自己的场景来决定使用何种数据结构。

在这里插入图片描述

以下是一个简单的 Java 实现的双向链表。双向链表每个节点都有两个引用:一个指向前一个节点,一个指向下一个节点。

//节点类
class DoublyNode {int data;  // 节点数据DoublyNode next; // 指向下一个节点的引用DoublyNode prev; // 指向前一个节点的引用// 构造函数DoublyNode(int data) {this.data = data;this.next = null;this.prev = null;}
}
//双向链表类
class DoublyLinkedList {private DoublyNode head; // 链表头部private DoublyNode tail; // 链表尾部// 构造函数public DoublyLinkedList() {head = null;tail = null;}// 添加节点到链表尾部public void append(int data) {DoublyNode newNode = new DoublyNode(data);if (head == null) {head = newNode;tail = newNode;} else {tail.next = newNode;newNode.prev = tail;tail = newNode;}}// 显示链表从头到尾public void displayForward() {DoublyNode current = head;while (current != null) {System.out.print(current.data + " <-> ");current = current.next;}System.out.println("null");}// 显示链表从尾到头public void displayBackward() {DoublyNode current = tail;while (current != null) {System.out.print(current.data + " <-> ");current = current.prev;}System.out.println("null");}// 查找节点public boolean find(int data) {DoublyNode current = head;while (current != null) {if (current.data == data) {return true;}current = current.next;}return false;}
}
//测试双向链表
public class DoublyLinkedListTest {public static void main(String[] args) {DoublyLinkedList list = new DoublyLinkedList();// 添加节点list.append(10);list.append(20);list.append(30);// 显示链表System.out.print("从头到尾: ");list.displayForward();System.out.print("从尾到头: ");list.displayBackward();// 查找节点System.out.println("查找20: " + list.find(20));System.out.println("查找40: " + list.find(40));}
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【Java集合】ArrayList
  • Java HashMap 总结
  • LeetCode-160.相交链表
  • C#学习笔记(三)Visual Studio安装与使用
  • 第十一章 【后端】商品分类管理微服务(11.1)——创建父工程
  • linux 操作系统下dd 命令介绍和使用案例
  • 【有啥问啥】对比学习(Contrastive Learning,CL)的原理与前沿应用详解
  • 【目标检测数据集】锯子数据集1107张VOC+YOLO格式
  • 【踩坑】装了显卡,如何让显示器从主板和显卡HDMI都输出
  • MATLAB入门教程
  • (k8s)Kubernetes 从0到1容器编排之旅
  • linux网络编程——UDP编程
  • 【深度学习】神经网络-怎么分清DNN、CNN、RNN?
  • 深度剖析去中心化存储:IPFS、Arweave 和 BNB Greenfield 的技术革新与生态系统演进
  • 30款免费好用的工具,打工人必备!
  • 【node学习】协程
  • 【许晓笛】 EOS 智能合约案例解析(3)
  • CEF与代理
  • CentOS7 安装JDK
  • gops —— Go 程序诊断分析工具
  • HTML中设置input等文本框为不可操作
  • jquery cookie
  • Mysql5.6主从复制
  • Redis提升并发能力 | 从0开始构建SpringCloud微服务(2)
  • Solarized Scheme
  • supervisor 永不挂掉的进程 安装以及使用
  • tweak 支持第三方库
  • 阿里云应用高可用服务公测发布
  • 创建一个Struts2项目maven 方式
  • 基于Mobx的多页面小程序的全局共享状态管理实践
  • 利用jquery编写加法运算验证码
  • 利用阿里云 OSS 搭建私有 Docker 仓库
  • 爬虫模拟登陆 SegmentFault
  • 前端js -- this指向总结。
  • 如何利用MongoDB打造TOP榜小程序
  • 如何设计一个比特币钱包服务
  • 新版博客前端前瞻
  • [Shell 脚本] 备份网站文件至OSS服务(纯shell脚本无sdk) ...
  • 【干货分享】dos命令大全
  • 树莓派用上kodexplorer也能玩成私有网盘
  • ​直流电和交流电有什么区别为什么这个时候又要变成直流电呢?交流转换到直流(整流器)直流变交流(逆变器)​
  • ‌JavaScript 数据类型转换
  • (9)目标检测_SSD的原理
  • (八)光盘的挂载与解挂、挂载CentOS镜像、rpm安装软件详细学习笔记
  • (草履虫都可以看懂的)PyQt子窗口向主窗口传递参数,主窗口接收子窗口信号、参数。
  • (二)JAVA使用POI操作excel
  • (二)十分简易快速 自己训练样本 opencv级联lbp分类器 车牌识别
  • (附源码)spring boot基于Java的电影院售票与管理系统毕业设计 011449
  • (附源码)ssm高校升本考试管理系统 毕业设计 201631
  • (接口自动化)Python3操作MySQL数据库
  • (算法)区间调度问题
  • (杂交版)植物大战僵尸
  • (转)Sql Server 保留几位小数的两种做法
  • (转)Unity3DUnity3D在android下调试
  • .env.development、.env.production、.env.staging