2Java学习笔记之数据结构——双向链表
时间:2022-06-17
本文章向大家介绍2Java学习笔记之数据结构——双向链表,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
在上一篇的单链表里,数据结构是单向的,只能从前往后一个一个找,而不能倒着来。因为每个节点Node只保存了下一个节点的位置。
这一篇的双向链表则是每个节点保存了上一个节点和下一个节点的位置,这样就能根据任何一个节点来寻找上或者下的节点了,向前向后都能遍历了。
直接上代码吧,比较简单。
package doublelink;
/**
* Created by admin on 17/3/27.
* 双链表的node
*/
public class Node {
private String data;
private Node next;
private Node pre;
public Node(String data) {
this.data = data;
}
public String getData() {
return data;
}
public void setData(String data) {
this.data = data;
}
public Node getNext() {
return next;
}
public void setNext(Node next) {
this.next = next;
}
public Node getPre() {
return pre;
}
public void setPre(Node pre) {
this.pre = pre;
}
}
package doublelink;
/**
* Created by admin on 17/3/27.
* 双链表
*/
public class DoubleLinkedList {
private int size;
private Node head;
public DoubleLinkedList() {
size = 0;
}
public int size() {
return size;
}
public void print() {
if (size == 0) {
System.out.println("空列表");
return;
}
Node node = head;
while (node != null) {
System.out.println(node.getData());
node = node.getNext();
}
}
/**
* 在末尾追加一个node
* @param node
*/
public void add(Node node) {
if (node == null) {
return;
}
if (head == null) {
head = node;
} else {
Node last = head;
//取到末尾的node
while (last.getNext() != null) {
last = last.getNext();
}
last.setNext(node);
node.setPre(last);
}
size++;
}
public void insert(int index, Node node) {
if (index < 0 || index > size) {
throw new RuntimeException("越界");
}
if (node == null) {
return;
}
//插头部
if (index == 0) {
if (head == null) {
head = node;
} else {
node.setNext(head);
head.setPre(node);
}
} else {
//将被插入的位置的父节点
Node beInsertedNode = head;
for (int i = 0; i < index - 1; i++) {
beInsertedNode = beInsertedNode.getNext();
}
//插到尾部的话,就不走括号内了
if(beInsertedNode.getNext() != null) {
node.setNext(beInsertedNode.getNext());
beInsertedNode.getNext().setPre(node);
}
beInsertedNode.setNext(node);
node.setPre(beInsertedNode);
}
size++;
}
/**
* 根据index查找某个节点
* @param index
* @return
*/
public Node get(int index) {
if(index < 0 || index >= size) {
throw new RuntimeException("越界");
}
Node node = head;
for (int i = 0; i < index; i++) {
node = node.getNext();
}
return node;
}
}
代码也比较好理解,无非就是insert时注意一下设置前后节点的引用。
具体双向链表的用途,还是得看实际情况。
- silverlight:RadMaskedTextBox设置MaskType="Numeric"及Mask="n"时的一个bug
- 微信里面最神秘的功能,你知道吗?
- 以大数据之名,变身!——In big data we trust
- 90%家长都不知道关于少儿编程的这些疑题!
- 常用SQL语句和语法汇总
- Python学习笔记1——斐波那契数列
- 视觉传感器几大技术要点详解!
- Spark之搜狗日志查询实战
- 区块链与数字货币是什么关系呢?
- 保存数据到MySql数据库——我用scrapy写爬虫(二)
- 人工智能将取代人类?危机亦或是新的机遇
- 大数据驱动的未来网络:体系架构与应用场景(下)网络架构与场景详解
- 冷静点,NVIDIA 禁止 Geforce 进数据中心想限制的并不是深度学习
- 智能机器人崛起背后的中国力量
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 面向新手解析python Beautiful Soup基本用法
- 基于keras中的回调函数用法说明
- PHP实现读取文件夹及批量重命名文件操作示例
- Python多线程threading创建及使用方法解析
- django rest framework 过滤时间操作
- 浅谈TensorFlow之稀疏张量表示
- 解决Keras 中加入lambda层无法正常载入模型问题
- 基于python实现判断字符串是否数字算法
- Tensorflow tensor 数学运算和逻辑运算方式
- Tensorflow全局设置可见GPU编号操作
- YII框架http缓存操作示例
- 基于tf.shape(tensor)和tensor.shape()的区别说明
- PHP检查URL包含特定字符串实例方法
- Python使用xlrd实现读取合并单元格
- python模块如何查看