一、单链表

单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) + 指针(指示后继元素存储位置),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据。

在开头插入。在链接列表中插入新节点的最简单位置是开始。

从头开始删除。删除链表中的第一个节点也很容易


在末尾插入。要在链接列表的末尾插入一个节点,我们维护一个指向列表中最后一个节点的链接。

/*** 单链表*/
class SingleLinked {Node HeadNode = new Node(0, "", "");//创建链表时头结点便已经创建完成在//增加节点public void add(Node node) {Node temp = HeadNode;while (temp.next != null) temp = temp.next;temp.next = node;}/*** 按no的顺序添加节点*/public void addNodeByOrder(Node node) {Node temp = HeadNode;while (temp.next != null) {//如果没有大小匹配的,就放在末尾if (temp.no < node.no && temp.next.no > node.no) break;}if (temp.next == null) {temp.next = node;} else {node.next = temp.next;temp.next = node;}}/*** 根据no修改信息*/public void updateNodeByNo(Node newNode) {Node temp = HeadNode;while (true) {if (temp.no == newNode.no) {temp.name = newNode.name;temp.nickName = newNode.nickName;break;}//最后一个节点if (temp.next == null) throw new RuntimeException("no错误");temp = temp.next;}}/*** 删除节点*/public void deletNodeByNo(int no) {Node temp = HeadNode;if (temp.next == null) {System.out.println("链表为空");return;}Node pre = temp;//前驱指针temp = temp.next;while (true) {if (temp.no == no) {pre.next = temp.next;break;}if (temp.next == null) break;pre = temp;temp = temp.next;}}/*** 遍历当前链表*/public void showLinked() {if (HeadNode.next == null) {System.out.println("链表为空");return;}Node temp = HeadNode.next;while (true) {System.out.println(temp);if (temp.next == null) break;temp = temp.next;}}
}

节点类

/*** 节点类*/
class Node {public int no;//编号public String name;public String nickName;public Node next;//指向下一个节点//节点的构造方法public Node(int no, String name, String nickName) {this.no = no;this.name = name;this.nickName = nickName;this.next = null;}@Overridepublic String toString() {return new StringJoiner(", ", Node.class.getSimpleName() + "[", "]").add("no=" + no).add("name='" + name + "'").add("nickName='" + nickName + "'").toString();}
}

二、双向链表

双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向循环链表

/*** 链表类*/
class DoublyLinked {private DoubleNode FirstNode = new DoubleNode(0, "");//创建链表时先初始化一个头结点/*** 最后一个节点后** @param node*/public void add(DoubleNode node) {DoubleNode temp = FirstNode;while (temp.getNext() != null) {temp = temp.getNext();}temp.setNext(node);node.setPre(temp);}/*** 按顺序添加节点*/public void addByOrder(DoubleNode node) {DoubleNode temp = FirstNode;while (true) {if (temp.getNo() == node.getNo()) {System.out.println("节点已经存在");return;}if (temp.getNo() > node.getNo()) {//中间插入temp.getPre().setNext(node);node.setPre(temp.getPre());node.setNext(temp);temp.setPre(node);break;}if (temp.getNext() == null) {//最后一个节点temp.setNext(node);node.setPre(temp);break;}temp = temp.getNext();}}/*** 遍历链表*/public void showLinked() {if (FirstNode.getNext() == null) {System.out.println("链表为空");return;}DoubleNode temp = FirstNode.getNext();while (true) {System.out.println(temp);if (temp.getNext() == null) break;temp = temp.getNext();}}/*** 删除节点*/public void deleteNode(int no) {if (FirstNode.getNext() == null) {System.out.println("链表为空");return;}DoubleNode temp = FirstNode.getNext();while (true) {if (temp.getNo() == no) {temp.getPre().setNext(temp.getNext());temp.getNext().setPre(temp.getPre());}if (temp.getNext() == null) break;temp = temp.getNext();}}/*** 修改节点信息*/public void updateNode(DoubleNode newNode) {if (FirstNode.getNext() == null) {System.out.println("链表为空");return;}DoubleNode temp = FirstNode.getNext();while (true) {if (temp.getNo() == newNode.getNo()) {temp.setName(newNode.getName());break;}if (temp.getNext() == null) {System.out.println("没有相关节点");break;}temp = temp.getNext();}}
}

节点类

/*** 节点类*/
class DoubleNode {private int no;private String name;private DoubleNode next;//指向后一个节点private DoubleNode pre;//指向前一个节点public DoubleNode(int no, String name) {this.no = no;this.name = name;}public int getNo() {return no;}public void setNo(int no) {this.no = no;}public String getName() {return name;}public void setName(String name) {this.name = name;}public DoubleNode getNext() {return next;}public void setNext(DoubleNode next) {this.next = next;}public DoubleNode getPre() {return pre;}public void setPre(DoubleNode pre) {this.pre = pre;}@Overridepublic String toString() {return new StringJoiner(", ", DoubleNode.class.getSimpleName() + "[", "]").add("no=" + no).add("name='" + name + "'").toString();}
}

数据结构第一谈:单链表双向链表的实现(基于Java)相关推荐

  1. 【python】数据结构和算法 + 浅谈单链表与双链表的区别

    有这么一句话说"程序=数据结构+算法",也有人说"如果把编程比作做菜,那么数据结构就好比食材(菜),算法就好比厨艺(做菜的技巧)". 当然这是笼统的说法,不过也 ...

  2. python数据结构基础(单链表,多链表,二叉树)

    python数据结构基础(单链表,多链表,二叉树) 数据结构指数据对象中数据元素之间的关系 Python 给我们提供了很多现成的数据结构类型,这些系统自己定义好的,不需要我们自己去定义的数据结构叫做 ...

  3. 数据结构之——《单链表》

    数据结构之--<单链表> 1.链表概念 2.链表分类 3.接口函数实现 1.链表概念 链表是一种物理存储结构上非连续,非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现. ...

  4. 数据结构精讲——单链表

    新手必会数据结构精讲--单链表 链表的介绍 概念:链表是一种物理存储结构上非连续.非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的 . 实际中链表的结构非常多样,以下情况组合起来就 ...

  5. 【数据结构】循环单链表的实现(C语言)

    循环单链表应掌握以下基本操作: 1.建立一个空的循环单链表. 2.获得循环单链表的最后一个结点的位置. 3.输出循环单链表中各结点的值. 4.在循环单链表中查找值为x的结点. 5.在循环单链表中第i个 ...

  6. 数据结构与算法--单链表相关面试题

    此文章仅作为自己学习过程中的记录和总结,同时会有意地去用英文来做笔记,一些术语的英译不太准确,内容如有错漏也请多指教,谢谢! 一.概述 获取单链表的有效元素个数[新浪面试题1] 获取单链表倒数第k个结 ...

  7. 单链表(LinkedList)的java实现(注释详细)

    单链表(LinkedList)的java实现 重点: 1.链表是以节点的方式存储的: 2.每个节点包含data域.next域:指向下一个节点: 3.链表的各个节点不一定是连续存储: 4.链表分带头节点 ...

  8. 基于链表实现队列(基于Java实现)

    title: 基于链表实现队列(基于Java实现) tags: 链表 队列 基于链表的队列实现方法的原理: 基于链表的实现,跟前面的基于数组实现一样,同样也需要两个指针:head指针和tail指针.它 ...

  9. 数据结构与算法——单链表、双向链表

    目录 ​编辑 特点: 一.单链表 1.增加数据到链表尾部 2.增加数据到链表指定位置 思路: 代码实现: 3.修改单链表数据 3.单链表数据删除 4.单链表相关面试题 二.双向链表 1.双向链表遍历 ...

最新文章

  1. 汇智清华,医道生机 | 第四届清华校友三创大赛医疗健康行业论坛圆满召开
  2. Django实战(11):修改Model类
  3. 格伦布编码——rice编码无非是golomb编码M为2^x的特例
  4. 今日代码(200708)--缺失值处理
  5. Touch the AppCache manifest file
  6. P4878 [USACO05DEC]Layout G
  7. ubuntu16.04 wget java_linux centos ubuntu下载安装JDK wget方式下载JDK
  8. 计算机科学导论课后感,计算机科学导论课后总结_5
  9. 网管员的最爱!解密六款低成本RADIUS
  10. 红茶三杯的博客-一个IE的博客
  11. java开源项目地址
  12. (无显示器,无网线,无路由)使用笔记本实现ssh远程登录树莓派3b+,并登录远程桌面(附OpenCV安装教程推荐)
  13. Armv8-R系列之何为MPU?
  14. TAC配置错误导致无法切换
  15. Mac Excel快捷键
  16. android列表倒计时,RecyclerView实现列表倒计时
  17. nginx 地址重写 、反向代理
  18. CLion+mingw-w64开发OpenGL如何导入glad
  19. 成功解决:不允许有匹配 “[xX][mM][lL]“ 的处理指令目标。
  20. Lattice系列FPGA入门相关1(Lattice系列FPGA简介)

热门文章

  1. 2023年Spring MVC相关面试题
  2. 12.12世界梦想日:他们都说了啥?
  3. 小组第四次会议记录(11月5日)
  4. 学习HTML5这一篇就够了
  5. 第14周翻译Stairway to Transaction Log Management in SQL Server, Level 5: Managing the Log in Full Rec...
  6. Vue 使用百度地图画点线面和标记
  7. 智能数字资产管理系统,全面提升企业的管理效率
  8. 回顾·智能导购对话机器人实践
  9. 使用koa和phantom.js 搭建一个html转pfd的服务
  10. 上传时压缩图片-Picdict