数据结构与算法之线性结构链表

这一篇文章主要介绍的是通过java实现单链表、循环链表和双向循环链表,仅供自己复习使用,如有什么不足之处,欢迎指出。
单链表:

package xianxingjiegou;//单链表
public class SingleNode {//当前节点的数据int data;//下一个节点SingleNode nextNode;//有参构造,给当前的节点赋值public SingleNode(int data) {// TODO Auto-generated constructor stubthis.data = data;}//给节点之间添加追加关系//第一种方式
//  public void append(SingleNode node) {
//      this.nextNode = node;
//  }//第二种方式,无限向后追加public SingleNode append(SingleNode node) {//当前节点SingleNode curreNode = this;while(true) {//当前节点的下一个节点SingleNode next = curreNode.nextNode;//当前节点的下一个节点为null时,退出循环if (next==null) {break;}//当前节点的下一个节点不为null时,把下一节点当做当前节点curreNode = next;}//退出循环后,该节点为最后一个节点,此时追加下一个需要追加的节点return curreNode.nextNode = node;}//获取下一个节点public SingleNode next() {return this.nextNode;}//获取当前的节点的数据public int getData() {return this.data;}//判定当前的节点是否为最后一个节点public boolean lastNode() {return this.nextNode==null;}//删除某一个节点的下一个节点public void removeNode() {//将当前节点的下一个节点的下一个节点,赋值给一个新的节点SingleNode newNextNode = nextNode.nextNode;//将当前节点的下一个节点的下一个节点赋给当前节点的下一个节点,完成删除this.nextNode = newNextNode;}//显示所有的节点信息public void show() {//赋值给当前的节点SingleNode currentNode = this;while(true) {//打印当前的节点数据信息System.out.print(currentNode.data+" ");//将当前的节点的下一个节点当做新的节点SingleNode newNext = currentNode.nextNode;//如果新的节点为null,跳出循环if (newNext==null) {break;}//否则将新的节点当做当前节点currentNode = newNext;}System.out.println();}//插入一个节点public void insert(SingleNode node) {//将当前节点的下一个节点当做下一个节点的下一个节点SingleNode newNext = nextNode;//将新节点当做当前节点的下一个节点nextNode = node;//把原来的下一个节点当做新节点的下一个节点nextNode.nextNode = newNext;}}

单链表的测试类:

package test;import xianxingjiegou.SingleNode;public class TestSingleNode {public static void main(String[] args) {// TODO Auto-generated method stub//添加节点SingleNode node1 = new SingleNode(1);SingleNode node2 = new SingleNode(2);SingleNode node3 = new SingleNode(3);//进行节点的追加,第一种方式
//      node1.append(node2);
//      node2.append(node3);//进行节点的追加node1.append(node2);node1.append(node3);//无限向后追加测试System.out.println(node1.next().next().append(new SingleNode(4)).getData());//判定当前节点是否为最后一个节点测试boolean lastNode = node3.lastNode();System.out.println(lastNode);boolean lastNode1 = node3.next().lastNode();System.out.println(lastNode1);//显示所有节点信息node1.show();//删除当前节点的下一个节点node1.removeNode();//显示此时所有节点信息node1.show();//插入一个节点SingleNode node = new SingleNode(2);node1.insert(node);//显示此时所有节点信息node1.show();}}

单链表的测试结果:

4
false
true
1 2 3 4
1 3 4
1 2 3 4

循环链表:

package xianxingjiegou;//循环链表
public class LoopNode {//当前节点的数据int data;//下一个节点LoopNode nextNode = this;//循环链表的关键一步就是这里//有参构造,给当前的节点赋值public LoopNode(int data) {// TODO Auto-generated constructor stubthis.data = data;}//获取下一个节点public LoopNode next() {return this.nextNode;}//获取当前的节点的数据public int getData() {return this.data;}//删除某一个节点的下一个节点public void removeNode() {//将当前节点的下一个节点的下一个节点,赋值给一个新的节点LoopNode newNextNode = nextNode.nextNode;//将当前节点的下一个节点的下一个节点赋给当前节点的下一个节点,完成删除this.nextNode = newNextNode;}//插入一个节点public void insert(LoopNode node) {//将当前节点的下一个节点(也就是他自己本身)当做下一个节点的下一个节点LoopNode newNext = nextNode;//将新节点当做当前节点的下一个节点nextNode = node;//把原来的下一个节点当做新节点的下一个节点nextNode.nextNode = newNext;}}

循环链表测试类:

package test;import xianxingjiegou.LoopNode;public class TestLoopNode {public static void main(String[] args) {// TODO Auto-generated method stub//创建对象LoopNode n1 = new LoopNode(6);LoopNode n2 = new LoopNode(7);LoopNode n3 = new LoopNode(8);LoopNode n4 = new LoopNode(9);LoopNode n5 = new LoopNode(10);//进行对象间的关系追加n1.insert(n2);//测试循环链表是否成立System.out.println(n1.next().getData());System.out.println(n2.next().getData());System.out.println("==============");//继续追加n2.insert(n3);n3.insert(n4);n4.insert(n5);//二次测试是否成立System.out.println(n1.next().getData());System.out.println(n2.next().getData());System.out.println(n3.next().getData());System.out.println(n4.next().getData());System.out.println(n5.next().getData());}}

循环链表测试结果:

7
6
==============
7
8
9
10
6

双向循环链表:

package xianxingjiegou;//双向循环链表
public class DoubleLoopNode {//当前的节点数据int data;//当前节点的前一个节点DoubleLoopNode pre = this;//当前节点的下一个节点DoubleLoopNode next = this;//构造函数初始化public DoubleLoopNode(int data) {// TODO Auto-generated method stubthis.data = data;}//追加(增加)节点public void insert(DoubleLoopNode node) {//将当前节点下一个节点作为下一个节点的下一个节点DoubleLoopNode newNext = next;//把当前节点的下一个节点设置为新增加的节点this.next = node;//新增加的节点的下一个节点设置为newNextnode.next = newNext;//newNext的前一个节点设置为新增加的节点newNext.pre = node;//新增加的节点的前一个节点设置为当前节点node.pre = this;}//获取当前节点的数据public int getData() {return this.data;}//下一个节点public DoubleLoopNode next() {return this.next;}//上一个节点public DoubleLoopNode pre() {return this.pre;}
}

双向循环链表测试类:

package test;import xianxingjiegou.DoubleLoopNode;public class TestDoubleLoopNode {public static void main(String[] args) {// TODO Auto-generated method stub//创建双向循环链表DoubleLoopNode n1 = new DoubleLoopNode(1);DoubleLoopNode n2 = new DoubleLoopNode(2);DoubleLoopNode n3 = new DoubleLoopNode(3);DoubleLoopNode n4 = new DoubleLoopNode(4);DoubleLoopNode n5 = new DoubleLoopNode(5);DoubleLoopNode n6 = new DoubleLoopNode(6);//第一次开始追加n1.insert(n2);//第一次追加证明System.out.println(n1.pre().getData());System.out.println(n2.next().getData());System.out.println("==================");//第二次开始追加n2.insert(n3);n3.insert(n4);n4.insert(n5);n5.insert(n6);System.out.println(n1.pre().getData());System.out.println(n2.next().getData());System.out.println(n3.next().getData());System.out.println(n4.next().getData());System.out.println(n5.next().getData());System.out.println(n6.next().getData());}}

双向循环链表的测试结果:

2
1
==================
6
3
4
5
6
1

往事种种,似水无痕、、、

数据结构与算法之线性结构链表相关推荐

  1. 从零开始学数据结构和算法(二)线性表的链式存储结构

    链表 链式存储结构 定义 线性表的链式存储结构的特点是用一组任意的存储单元的存储线性表的数据元素,这组存储单元是可以连续的,也可以是不连续的. 种类 结构图 单链表 应用:MessageQueue 插 ...

  2. 黑马程序员 C语言数据结构与算法之线性表(链表/栈/队列/顺序表)

    C语言 链表基础知识清晰讲解(黑马) 讲的蛮好,就是音质不太好,有时听不清讲的啥! [黑马]数据结构与算法之线性表(链表/栈/队列/顺序表)[配套源码 嘛蛋,看错了,这是java的... 文章目录 链 ...

  3. 数据结构与算法(一) 线性表之顺序表

     线性表是一种最简单.最常用的数据结构,根据存储方式可以分为顺序表和链表.  顺序表: 顺序表指的是用一组地址连续的存储单元依次存储线性表的数据元素,称为线性表的顺序存储结构或顺序映像(sequent ...

  4. 数据结构和算法基础--线性表

    数据结构和算法基础–线性表 数据结构 = 数据的逻辑结构+数据的存储结构+数据的运算 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-28ek7MfI-164242629 ...

  5. rsa算法c语言实现_数据结构与算法之线性表-顺序表实现(C语言版本)

    原文托管在Github: https://github.com/shellhub/blog/issues/52 数据结构与算法之线性表-顺序表实现(C语言版本) 前言 数据结构与算法是一个程序员必备的 ...

  6. python函数结构图_Python数据结构与算法之图结构(Graph)实例分析

    本文实例讲述了Python数据结构与算法之图结构(Graph).分享给大家供大家参考,具体如下: 图结构(Graph)--算法学中最强大的框架之一.树结构只是图的一种特殊情况. 如果我们可将自己的工作 ...

  7. python define graph_Python数据结构与算法之图结构(Graph)实例分析

    本文实例讲述了Python数据结构与算法之图结构(Graph).分享给大家供大家参考,具体如下: 图结构(Graph)--算法学中最强大的框架之一.树结构只是图的一种特殊情况. 如果我们可将自己的工作 ...

  8. 数据结构与算法(C++)– 链表(Link)

    数据结构与算法(C++)– 链表(Link) 1.基础知识 表:把具有相同类型的序列 A0, A1, A2, - An 称为表 .n 是表的大小,n=0 称为空表. A0没有前驱,An没有后继. 前驱 ...

  9. 数据结构与算法之RandomPool结构和岛问题

    数据结构与算法之RandomPool结构和岛问题 目录 RandomPool结构 岛问题 1. RandomPool结构 (一)题目概述 (二)思路分析 完成上述功能需要创建两个hashmap结构 i ...

最新文章

  1. mysql远程连接工具 cen_Navicat远程连接Centos数据库Mysql
  2. drupal7获取当前路径别名
  3. MySQL学习之路:多实例无法启动排错
  4. Ubuntu18.04将软件(Eclipse)固定在侧边收藏夹
  5. php 毛玻璃,CSS3实现毛玻璃(图片模糊)效果
  6. tortoise清理本地分支_本地:延庆运污水环卫抽化粪池
  7. Socket通用TCP通信协议设计及实现(防止粘包,可移植,可靠)
  8. SqlServer2000中作业无法删除的原因和解决办法
  9. Java——用户激活邮件工具类
  10. 9款超级好看有创意的表白网页源码
  11. 一种多源信息融合方法及其应用(Matlab代码实现)
  12. OBS Studio是一款非常专业的视频直播录制软件,完全免费
  13. mysql etimedout_Node.js MySQL ETIMEDOUT error
  14. 免费域名邮箱如何申请?怎么给国外发邮件?
  15. 搞副业被领导发现了,让我要么停止,要么滚蛋!
  16. 【C++】黑马程序员 C++学习课程—C++基础入门
  17. java时间段分割_任意一个起止时间段(如:20160101-20161009),用java将这个时间段拆分成一个个按自然周组成的时间段...
  18. 苹果xr截屏怎么截_苹果系统截屏录屏+标记剪辑功能详解( iPhone/iPad/Mac)
  19. html数据类型判断,JS中判断数据类型的几种方法
  20. python kivy 手势识别基本代码

热门文章

  1. html表格空格符是什么,HTML中的空格符号是什么
  2. 赛效:快速、简单的在线修改图片工具怎么用
  3. 基于Nodejs的心理咨询微信小程序的设计和实现
  4. 软考高项我一次考过的秘诀 | 附记忆口诀记忆方法
  5. WPF 获取DataGrid 控件选中的单元格信息
  6. Excel正则表达式一键提取英文和数字的操作
  7. 第四代微软小冰:情感框架升级+全时感官+融入社会
  8. Pixhawk---fatal: Not a git repository (or any of the parent directories)
  9. 推荐几款我常用的浏览器
  10. 移动端APP测试常见面试题精析