数据结构(三)–链表

文章目录

  • 数据结构(三)--链表
    • 介绍
    • 单链表
      • 代码实现
      • 翻转链表
      • 取出倒数第n个有效节点

介绍

链表又分:

  • 单链表
  • 双链表

单链表

  • 头节点不存储数据,所有操作临时引用指向head;
  • 删除/插入节点:先判断当前节点是否满足删除或插入条件,然后判断是否可以移动,最后移动(反复)
  • 遍历节点:判断是否可以移动,移动,打印
  • 打印某一节点:判断是否可以移动,移动,判断当前节点是否可以打印(反复)

代码实现

先实现节点

根据需要可以将数据域data的类型改为泛型**< T >**

public class NodeT<T>{private T data;private Node next;public NodeT(){}public NodeT(T data,Node next){this.data = data;this.next = next;}public Node getNext() {return next;}public void setNext(Node next) {this.next = next;}public T getData() {return data;}public void setData(T data) {this.data = data;}@Overridepublic String toString() {return "NodeT{" +"data='" + data + '\''+"}";}
}

实现单链表

public class LinelistT<T> {private NodeT head ;public LinelistT(){head = new NodeT<T>(null,null);}//打印所有节点public  void printNodes(){NodeT tepm = head;while (true){if (tepm.getNext()==null) break;tepm = tepm.getNext();System.out.println(tepm);}}//尾部添加数据public void addNode(T data){NodeT<T> node = new NodeT<T>(data,null);NodeT<T> temp = head;while (true){if (temp.getNext()==null){temp.setNext(node);break;}temp = temp.getNext();}}//插入数据public void insertNode(int index,T data){//判断越界if (index<=0) throw new RuntimeException("越界");NodeT<T> node = new NodeT<T>(data,null);NodeT temp = head;int i=0;while (true){//添加节点if (i==index-1){node.setNext(temp.getNext());temp.setNext(node);break;}//判断越界if (temp.getNext()==null) throw new RuntimeException("越界!!!");//移动temp = temp.getNext();i++;}}//删除节点public NodeT deleteNode(int index) {//判断越界if (index <=0 )new RuntimeException("越界!!!");NodeT temp = head;int i = 0;while (true) {//删除节点if (i == index - 1 && temp.getNext() != null) {NodeT temp2 = temp.getNext();temp.setNext(temp2.getNext());temp2.setNext(null);return temp2;}//判断越界if (temp.getNext()==null)throw new RuntimeException("越界!!!");//移动temp = temp.getNext();i++;}}//打印某一节点public void printNode(int index){//判断越界if (index<=0) new RuntimeException("越界!!!");NodeT temp = head;int i=0;while (true){//判断越界if (temp.getNext()==null) {new RuntimeException("越界!!!");}//移动i++;temp = temp.getNext();//打印if (i==index){System.out.println(temp);break;}}}}

主函数

public static void main(String[] args) {LinelistT<String> line = new LinelistT<String>();line.addNode("节点一");line.addNode("节点二");line.addNode("节点三");line.printNodes();System.out.println("-----------------------------");line.deleteNode(2);line.printNodes();System.out.println("-----------------------------");line.insertNode(2,"插入节点");line.printNodes();System.out.println("-----------------------------");}

结果

NodeT{data='节点一'}
NodeT{data='节点二'}
NodeT{data='节点三'}
-----------------------------
NodeT{data='节点一'}
NodeT{data='节点三'}
-----------------------------
NodeT{data='节点一'}
NodeT{data='插入节点'}
NodeT{data='节点三'}
-----------------------------

翻转链表

在单链表中添加以下方法即可,思路如下:

  • 创建一个新的临时链表reverseHead
  • 取出原链表的第一个有效节点
  • 将原链表的第一个有效节点插入到临时链表的第一个有效位置(head后面)
  • 将原链表Heda的next指向reverseHead的next即可
public void reverse(){//创建新链表LinelistT reverseHead = new LinelistT<T>();NodeT temp = head;while (true){try {NodeT node = this.deleteNode(1);reverseHead.insertNode(1,node.getData());}catch (RuntimeException e) {break;}}head.setNext(reverseHead.head.getNext());}

取出倒数第n个有效节点

获取有效节点个数

先写一个统计有效节点个数的函数,当然如果你想优化的话,完全可以在链表类中添加一个私有属性Num,用来记录个数,因为这里没写,所以就多写一个函数去遍历。

public int getNodeNum(){NodeT temp = head;int num = 0;while (true){//判断是否到尾部if (temp.getNext() == null) return num;temp = temp.getNext();num++;}}

获取倒数有效节点

public NodeT<T> getNodeByreverse(int reverseIndex){int num =  this.getNodeNum();if (reverseIndex>num || reverseIndex<=0) throw new RuntimeException("越界");NodeT<T> temp = head;int i = 0;while (true){if (i==num-reverseIndex+1) break;temp = temp.getNext();i++;}return temp;}

数据结构(三)--链表相关推荐

  1. C/C++版数据结构之链表三

    今天来讨论下链表中的双向链表. 双向链表: 概念:在双向链表中,结点除含有数据域外,还含有两个指针域:一个存储直接后继结点的地址,称为右链域:另一个存储直接前驱结点的地址,称为左链域. typedef ...

  2. linux内核数据结构之链表

    1.前言 最近写代码需用到链表结构,正好公共库有关于链表的.第一眼看时,觉得有点新鲜,和我之前见到的链表结构不一样,只有前驱和后继指针,而没有数据域.后来看代码注释发现该代码来自linux内核,在li ...

  3. 学习javascript数据结构(三)——集合

    前言 总括: 本文讲解了数据结构中的[集合]概念,并使用javascript实现了集合. 原文博客地址:学习javascript数据结构(三)--集合 知乎专栏&&简书专题:前端进击者 ...

  4. Java实现自定义队列和树结构_Java数据结构之链表、栈、队列、树的实现方法示例...

    本文实例讲述了java数据结构之链表.栈.队列.树的实现方法.分享给大家供大家参考,具体如下: 最近无意中翻到一本书,闲来无事写几行代码,实现几种常用的数据结构,以备后查. 一.线性表(链表) 1.节 ...

  5. Python数据结构之链表(linked list)

    Python数据结构之链表 一.链表的基本知识 最近在leetcode刷题时遇到了几道关于链表的题,于是恶补了一下关于链表的知识.什么是链表?熟悉python语法的同学肯定都知道list,但是这并不是 ...

  6. 假设以带头结点的循环链表表示队列_JavaScript数据结构之链表--设计

    上一篇文章中介绍了几种常见链表的含义,今天介绍下如何写出正确的链表代码. 如何表示链表 我们一般设计的链表有两个类.Node 类用来表示节点,LinkedList 类提供了一些辅助方法,比如说结点的增 ...

  7. 【数据结构】数据结构三要素

    数据结构三要素 数据结构的三要素包括数据逻辑结构.数据存储结构和数据的运算. 数据逻辑结构 数据的逻辑结构是指数据元素之间的逻辑关系,即从逻辑关系上描述数据.它与数据的具体存储形式无关,是独立于计算机 ...

  8. 搬砖:数据结构之链表基本操作总结

    数据结构之链表基本操作总结 2017年05月11日 18:22:11 Lily_whl 阅读数:19151 https://blog.csdn.net/Lily_whl/article/details ...

  9. 数据结构之链表 - 动图演示

    微信搜索[NO编程],关注这个与众不同的公众号. 个人网站:www.newobject.cc 版权声明:本文为原创文章,转载请注明出处. 链表简介 链表是很常见的数据结构,由一个个节点组成,每个节点中 ...

  10. 数据结构 —— 单链表(超详细图解 接口函数实现)

    系列文章目录 数据结构 -- 顺序表 数据结构 -- 单链表 数据结构 -- 双向链表 数据结构 -- 队列 数据结构 -- 栈 数据结构 -- 堆 数据结构 -- 二叉树 数据结构 -- 八大排序 ...

最新文章

  1. 3G重选至4G--基于优先级
  2. python源码学习_【Python学习】Python源码阅读(一)
  3. 用户用老版IE访问网站时的jquery提示插件
  4. 得到频域波形的坐标数组_10. 频域法之序
  5. 4152. [AMPPZ2014]The Captain(稠密图最短路)
  6. 您对无法重新创建的表进行了更改或者启用了“阻止保存要求重新创建表的更改”选项...
  7. 【云速建站】按照给定模板从0开始编辑网站页面
  8. 花书+吴恩达深度学习(十六)序列模型之双向循环网络 BRNN 和深度循环网络 Deep RNN
  9. django系列3.3--CBV 和 FBV
  10. 查看计算机屏幕颜色软件是什么,显示器颜色校正软件,详细教您显示器颜色校正软件...
  11. 【word论文排版教程3】制作样式和列表
  12. 在利用计算机高级语言进行,2016计算机一级考试多选题专项训练及答案
  13. 微信内置浏览器支付流程
  14. 全国25省市“智慧路灯”项目大汇总!
  15. 地铁译:Spark for python developers --- 搭建Spark虚拟环境1
  16. 跳转饿了么小程序、跳转美团小程序、获取小程序路径、小程序生成小程序码不能选择第三方小程序、领红包功能开发(附源码)
  17. 安装ros系统出现 404 Not Found [IP: 91.189.91.38 80]
  18. ARM7、ARM9、ARM11区别
  19. JSP Taglib指令具有什么功能呢?
  20. 什么是网络爬虫?它是如何工作的以及如何自动抓取

热门文章

  1. linux 用户/用户组添加修改删除(ubuntu/centos)
  2. Java 对象和类的一些笔记总结
  3. 关于SQL SERVER高并发解决方案
  4. jquery easyui combobox设置默认选中第一项
  5. Druid 连接泄漏监测
  6. C# log4net 不输出日志
  7. java 搭建论坛_GitHub - NieShaoLiang/bbs: 基于spring boot的java论坛系统
  8. moviepy报错之 .This error can be due to the fact that ImageMagick is not installed on your computer(亲测)
  9. jupyter notebook的链接密码 token查询 以及 pycharm 如何使用 jupyter notebook
  10. Centos+Nginx+PHP7.0编译安装(和PHP5.6老版本共存)