双向链表的简单Java实现-sunziren
写在前面,csdn的那篇同名博客就是我写的,我把它现在在这边重新发布,因为我实在不想用csdn了,那边的广告太多了,还有就是那个恶心人的“阅读更多”按钮,惹不起我躲得起。
在上次分享完单向链表的简单编写后,索性对于双向链表进行了一定的了解,在上次的基础上进行了一定程度的改进,做了一个非循环的双向链表。
双向链表的特点在于每个节点不仅知道自己的下属节点而且还知道自己的父节点。在双向链表的逆序方法中,我使用的队列来支持这个操作,利用了队列的先进先出的特点。
package demo_4;
import java.util.Stack;
public class MyDoubleList<Re_Helix> {
//节点内部类;
private class Node{
private Re_Helix data; //数据;
private Node next = null; //下个节点的引用;
private Node previous = null; //上个节点的引用;
public Node() { //节点的无参构造;
super();
}
public Node(Re_Helix data) { //节点的有参构造;
super();
this.data = data;
}
}
private Node head; //头部节点;
private Node end; //尾部节点;
private Node point; //临时节点;
private Node point_pre; //临时节点2;
private int length; //长度属性;
public MyDoubleList() { //链表的无参构造;
head = new Node();
end = head;
length = 0;
}
public int length() { //返回链表的长度;
return length;
}
public void showAll() { //在控制台查看当前链表中的所有数据
point = head;
int i = 0;
while(point!=null) {
System.out.println("第"+(i++)+"个:"+point.data);
point = point.next;
}
}
public Re_Helix getById(int target) { //输入下标返回值;
return packPoint(target).data;
}
public void input(Re_Helix data) {
point = new Node(data);
if(length==0) {
end.data = point.data;
}else {
point_pre = end;
end.next = point;
end = point;
point.previous = point_pre;
}
length++;
}
public void inputById(int target,Re_Helix data) {
point = packPoint(target);
Node temp = new Node(data);
if(target>=length) {
end.next = temp;
temp.previous = end;
end = temp;
}else if(target<=0) {
temp.next = head;
head.previous = temp;
head = temp;
}else {
temp.next = point;
temp.previous = point.previous;
point.previous.next = temp;
point.previous = temp;
}
length++;
}
public void deleteById(int target) { //输入下标删除值
if(target>0) {
packPoint(target-1).next = packPoint(target).next;
packPoint(target).next.previous = packPoint(target-1);
}else {
head.next.previous = null;
head = head.next;
}
length--;
}
public void deleteAll() { //清空链表;
length = 0;
head.data = null;
head.next = null;
point = null;
end = head;
System.gc();
}
public boolean editById(int target,Re_Helix data) { //修改传入下标位置的值;
if(target<0 || target>length) {
return false;
}else {
packPoint(target).data = data;
return true;
}
}
public void reverse() { //将链表反转;
Stack<Node> s1 = new Stack<Node>(); //利用队列的先进先出的特性;
point = head;
while(point!=null) {
s1.push(point);
point = point.next;
}
head = s1.pop();
head.previous = null;
point = head;
while(!s1.isEmpty()) {
point.next = s1.pop();
point_pre = point;
point = point.next;
point.previous = point_pre;
}
end = point;
end.next = null; //要将逆序后的end位置节点的next置空,不然会造成最后两位的循环;
}
private Node packPoint(int target) { //内部方法,将指针指向指定下标的节点;
if(target<=0) {
point = head;
}else if(target>=length) {
point = end;
}else {
int i = 0;
point = head;
while(i++!=target) {
point = point.next;
}
}
return point;
}
}
本文为我的原创文章,转载必须注明链接和我的ID:sunziren,否则就等着被举报吧,尤其是那什么狗屁“金铭鼎”教育。
多有不足,欢迎评论区批评指正。
双向链表的简单Java实现-sunziren的更多相关文章
- 单向链表的简单Java实现-sunziren
写在前面,csdn的那篇同名博客就是我写的,我把它现在在这边重新发布,因为我实在不想用csdn了,那边的广告太多了,还有就是那个恶心人的“阅读更多”按钮,惹不起我躲得起. 最近面试的过程中,发现有的公 ...
- 简单java在线测评程序
简单java程序在线测评程序 一.前言 大家过年好!今年的第一篇博客啊!家里没有网,到处蹭无线!日子过得真纠结!因为毕设的需求,简单写了一个java程序在线测评程序,当然也可以在本地测试. 二.思路 ...
- 输出多行字符的一个简单JAVA小程序
public class JAVA { public static void main(String[] args) { System.out.println("-------------- ...
- Java基础_0311: 数据表与简单Java类映射
数据表与简单Java类映射 现在假设有如下的关系表,现在要求实现如下的数据关联操作: 一个部门有多个雇员: 一个雇员有一个或零个领导 代码实现 class Dept { private int dep ...
- Java基础_0305:简单Java类
简单Java类 简单Java类是一种在实际开发之中使用最多的类的定义形式,在简单Java类中包含有类.对象.构造方法.private封装等核心概念的使用,而对于简单Java类首先给出如下的基本开发要求 ...
- JAVA基础学习之路(四)定义简单java类
简单java类开发一般原则: 类名称必须有意义,再怎么说,要让人家看的明白吧 类之中所有属性必须使用private封装,并提供setter,getter方法 类之中可以有多个构造方法,但是必须保留有一 ...
- Ant—使用Ant构建简单Java项目(三)
博客<Ant-使用Ant构建简单Java项目(二)>我们简化了运行Test类中main方法须要运行的命令,本博客来介绍一下如何使build.xml文件和当中使用property标签定义的属 ...
- JAVA 基础开发环境 vscode 搭建 Windows下VSCode编译运行简单java
JAVA 基础开发环境 vscode 搭建 来源 https://www.cnblogs.com/freewsf/p/7744728.html 对于使用 Visual Studio Code 的 Ja ...
- 数据表与简单java类映射转换
简单的Java类的定义来源于数据表的结构, 例如:雇员信息表.部门信息表描述的就是雇员或部门的信息, 在实际的开发之中,数据表和简单java类之间的映射关系如下: 1. 数据实体表设计 = 类的定义: ...
随机推荐
- Codeforces 961C Chessboard(将碎了的、染色乱了的棋盘碎片拼一起)
题目链接:点击打开链接 Magnus decided to play a classic chess game. Though what he saw in his locker shocked hi ...
- k8s集群PHP环境使用
一.环境介绍 k8s版本: 1.15.2 存储: 阿里云NAS 测试代码: wordpress 二.下载wordpress和创建好数据库等 1.下载wordpress wget https://cn. ...
- LVS 部署
一.LVS的组成 LVS 由2部分程序组成,包括 ipvs 和 ipvsadm. 1. ipvs(ip virtual server):一段代码工作在内核空间,叫ipvs,是真正生效实现调度的代码.2 ...
- vi/vim编辑器操作梳理
1. vi/vim编辑器详细使用讲解 1.1 vi/vim编辑器的3种模式 1.2 vi/vim编辑器操作说明 参数/命令/模式 说明 ###普通模式 :set nu 显示行号 :set non ...
- 前端工具配置(webpack 4、vue-cli 3)
随着前端项目复杂度的增加,其所依赖的资源也越来越多,从最初的HTML文件,CSS文件,JS文件发展到现在的各种预处理文件,模板文件等等.文件多了,项目大了,项目的维护就变得更加困难了,用户加载页面的速 ...
- 理解设备像素、设备独立像素、css像素、viewport
设备像素也叫物理像素. 设备像素指的是显示器上的真实像素,每个像素的大小是屏幕固有的属性,屏幕出厂以后就不会改变了. 设备分辨率描述的就是这个显示器的宽和高分别是多少个设备像素. 设备像素和设备分辨率 ...
- 将jsp页面转化为图片或pdf升级版(二)(qq:1324981084)
java高级架构师全套vip教学视频,需要的加我qq1324981084 上面我们已经将jsp页面转化成html页面了,那么接下来我们的目标是利用这个html页面形成pdf或图片格式.这里我用到的是w ...
- 宿主机休眠后,虚拟机网络ping不通网关
宿主机 win10 64位 虚拟机软件 vmware 15 虚拟机 centos 7 64位 网络模式:桥接模式 故障起因: 中午去吃饭,为了节省电费,把宿主机 windows 给休眠了 吃完饭 ...
- C++中static关键字的用法
运行一个完整的程序.我们可将整个存储区分为四块: (1)栈区:就比如局部变量,对应的函数参数等这些,调用完之后相应的内存会自己释放掉,很让人省心. (2)堆区:堆来堆去的.得要人动手.所以得我们自己手 ...
- 如何实现广告响应式滚动 OwlCarousel2
githu https://github.com/OwlCarousel2/OwlCarousel2 OwlCarousel2 官方网址 http://owlcarousel2.githu ...