数据结构(三)--链表
数据结构(三)–链表
文章目录
- 数据结构(三)--链表
- 介绍
- 单链表
- 代码实现
- 翻转链表
- 取出倒数第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;}
数据结构(三)--链表相关推荐
- C/C++版数据结构之链表三
今天来讨论下链表中的双向链表. 双向链表: 概念:在双向链表中,结点除含有数据域外,还含有两个指针域:一个存储直接后继结点的地址,称为右链域:另一个存储直接前驱结点的地址,称为左链域. typedef ...
- linux内核数据结构之链表
1.前言 最近写代码需用到链表结构,正好公共库有关于链表的.第一眼看时,觉得有点新鲜,和我之前见到的链表结构不一样,只有前驱和后继指针,而没有数据域.后来看代码注释发现该代码来自linux内核,在li ...
- 学习javascript数据结构(三)——集合
前言 总括: 本文讲解了数据结构中的[集合]概念,并使用javascript实现了集合. 原文博客地址:学习javascript数据结构(三)--集合 知乎专栏&&简书专题:前端进击者 ...
- Java实现自定义队列和树结构_Java数据结构之链表、栈、队列、树的实现方法示例...
本文实例讲述了java数据结构之链表.栈.队列.树的实现方法.分享给大家供大家参考,具体如下: 最近无意中翻到一本书,闲来无事写几行代码,实现几种常用的数据结构,以备后查. 一.线性表(链表) 1.节 ...
- Python数据结构之链表(linked list)
Python数据结构之链表 一.链表的基本知识 最近在leetcode刷题时遇到了几道关于链表的题,于是恶补了一下关于链表的知识.什么是链表?熟悉python语法的同学肯定都知道list,但是这并不是 ...
- 假设以带头结点的循环链表表示队列_JavaScript数据结构之链表--设计
上一篇文章中介绍了几种常见链表的含义,今天介绍下如何写出正确的链表代码. 如何表示链表 我们一般设计的链表有两个类.Node 类用来表示节点,LinkedList 类提供了一些辅助方法,比如说结点的增 ...
- 【数据结构】数据结构三要素
数据结构三要素 数据结构的三要素包括数据逻辑结构.数据存储结构和数据的运算. 数据逻辑结构 数据的逻辑结构是指数据元素之间的逻辑关系,即从逻辑关系上描述数据.它与数据的具体存储形式无关,是独立于计算机 ...
- 搬砖:数据结构之链表基本操作总结
数据结构之链表基本操作总结 2017年05月11日 18:22:11 Lily_whl 阅读数:19151 https://blog.csdn.net/Lily_whl/article/details ...
- 数据结构之链表 - 动图演示
微信搜索[NO编程],关注这个与众不同的公众号. 个人网站:www.newobject.cc 版权声明:本文为原创文章,转载请注明出处. 链表简介 链表是很常见的数据结构,由一个个节点组成,每个节点中 ...
- 数据结构 —— 单链表(超详细图解 接口函数实现)
系列文章目录 数据结构 -- 顺序表 数据结构 -- 单链表 数据结构 -- 双向链表 数据结构 -- 队列 数据结构 -- 栈 数据结构 -- 堆 数据结构 -- 二叉树 数据结构 -- 八大排序 ...
最新文章
- 3G重选至4G--基于优先级
- python源码学习_【Python学习】Python源码阅读(一)
- 用户用老版IE访问网站时的jquery提示插件
- 得到频域波形的坐标数组_10. 频域法之序
- 4152. [AMPPZ2014]The Captain(稠密图最短路)
- 您对无法重新创建的表进行了更改或者启用了“阻止保存要求重新创建表的更改”选项...
- 【云速建站】按照给定模板从0开始编辑网站页面
- 花书+吴恩达深度学习(十六)序列模型之双向循环网络 BRNN 和深度循环网络 Deep RNN
- django系列3.3--CBV 和 FBV
- 查看计算机屏幕颜色软件是什么,显示器颜色校正软件,详细教您显示器颜色校正软件...
- 【word论文排版教程3】制作样式和列表
- 在利用计算机高级语言进行,2016计算机一级考试多选题专项训练及答案
- 微信内置浏览器支付流程
- 全国25省市“智慧路灯”项目大汇总!
- 地铁译:Spark for python developers --- 搭建Spark虚拟环境1
- 跳转饿了么小程序、跳转美团小程序、获取小程序路径、小程序生成小程序码不能选择第三方小程序、领红包功能开发(附源码)
- 安装ros系统出现 404 Not Found [IP: 91.189.91.38 80]
- ARM7、ARM9、ARM11区别
- JSP Taglib指令具有什么功能呢?
- 什么是网络爬虫?它是如何工作的以及如何自动抓取
热门文章
- linux 用户/用户组添加修改删除(ubuntu/centos)
- Java 对象和类的一些笔记总结
- 关于SQL SERVER高并发解决方案
- jquery easyui combobox设置默认选中第一项
- Druid 连接泄漏监测
- C# log4net 不输出日志
- java 搭建论坛_GitHub - NieShaoLiang/bbs: 基于spring boot的java论坛系统
- moviepy报错之 .This error can be due to the fact that ImageMagick is not installed on your computer(亲测)
- jupyter notebook的链接密码 token查询 以及 pycharm 如何使用 jupyter notebook
- Centos+Nginx+PHP7.0编译安装(和PHP5.6老版本共存)