双向链表的简单Java实现-sunziren

  写在前面,csdn的那篇同名博客就是我写的,我把它现在在这边重新发布,因为我实在不想用csdn了,那边的广告太多了,还有就是那个恶心人的“阅读更多”按钮,惹不起我躲得起。



  在上次分享完单向链表的简单编写后,索性对于双向链表进行了一定的了解,在上次的基础上进行了一定程度的改进,做了一个非循环的双向链表。

  双向链表的特点在于每个节点不仅知道自己的下属节点而且还知道自己的父节点。在双向链表的逆序方法中,我使用的队列来支持这个操作,利用了队列的先进先出的特点。

  1 package demo_4;
  2
  3 import java.util.Stack;
  4
  5 public class MyDoubleList<Re_Helix> {
  6     //节点内部类;
  7     private class Node{
  8         private Re_Helix data;            //数据;
  9         private Node next = null;            //下个节点的引用;
 10         private Node previous = null;            //上个节点的引用;
 11
 12         public Node() {         //节点的无参构造;
 13             super();
 14         }
 15
 16         public Node(Re_Helix data) {         //节点的有参构造;
 17             super();
 18             this.data = data;
 19         }
 20     }
 21
 22     private Node head;            //头部节点;
 23     private Node end;            //尾部节点;
 24     private Node point;            //临时节点;
 25     private Node point_pre;        //临时节点2;
 26     private int length;            //长度属性;
 27
 28     public MyDoubleList() {            //链表的无参构造;
 29         head = new Node();
 30         end = head;
 31         length = 0;
 32     }
 33
 34     public int length() {            //返回链表的长度;
 35         return length;
 36     }
 37
 38     public void showAll() {            //在控制台查看当前链表中的所有数据
 39         point = head;
 40         int i = 0;
 41         while(point!=null) {
 42             System.out.println("第"+(i++)+"个:"+point.data);
 43             point = point.next;
 44         }
 45     }
 46
 47     public Re_Helix getById(int target) {            //输入下标返回值;
 48         return packPoint(target).data;
 49     }
 50
 51     public void input(Re_Helix data) {
 52         point = new Node(data);
 53         if(length==0) {
 54             end.data = point.data;
 55         }else {
 56             point_pre = end;
 57             end.next = point;
 58             end = point;
 59             point.previous = point_pre;
 60         }
 61         length++;
 62     }
 63
 64     public void inputById(int target,Re_Helix data) {
 65         point = packPoint(target);
 66         Node temp = new Node(data);
 67         if(target>=length) {
 68             end.next = temp;
 69             temp.previous = end;
 70             end = temp;
 71         }else if(target<=0) {
 72             temp.next = head;
 73             head.previous = temp;
 74             head = temp;
 75         }else {
 76             temp.next = point;
 77             temp.previous = point.previous;
 78             point.previous.next = temp;
 79             point.previous = temp;
 80         }
 81         length++;
 82     }
 83
 84     public void deleteById(int target) {            //输入下标删除值
 85         if(target>0) {
 86             packPoint(target-1).next = packPoint(target).next;
 87             packPoint(target).next.previous = packPoint(target-1);
 88         }else {
 89             head.next.previous = null;
 90             head = head.next;
 91         }
 92         length--;
 93     }
 94
 95     public void deleteAll() {            //清空链表;
 96         length = 0;
 97         head.data = null;
 98         head.next = null;
 99         point = null;
100         end = head;
101         System.gc();
102     }
103
104     public boolean editById(int target,Re_Helix data) {            //修改传入下标位置的值;
105         if(target<0 || target>length) {
106             return false;
107         }else {
108             packPoint(target).data = data;
109             return true;
110         }
111     }
112
113     public void reverse() {            //将链表反转;
114         Stack<Node> s1 = new Stack<Node>();            //利用队列的先进先出的特性;
115         point = head;
116         while(point!=null) {
117             s1.push(point);
118             point = point.next;
119         }
120         head = s1.pop();
121         head.previous = null;
122         point = head;
123         while(!s1.isEmpty()) {
124             point.next = s1.pop();
125             point_pre = point;
126             point = point.next;
127             point.previous = point_pre;
128         }
129         end = point;
130         end.next = null;  //要将逆序后的end位置节点的next置空,不然会造成最后两位的循环;
131     }
132
133     private Node packPoint(int target) {            //内部方法,将指针指向指定下标的节点;
134         if(target<=0) {
135             point = head;
136         }else if(target>=length) {
137             point = end;
138         }else {
139             int i = 0;
140             point = head;
141             while(i++!=target) {
142                 point = point.next;
143             }
144         }
145         return point;
146     }  }

  多有不足,欢迎评论区批评指正。

原文地址:https://www.cnblogs.com/sunziren/p/10254507.html

时间: 2024-10-11 03:21:52

双向链表的简单Java实现-sunziren的相关文章

单向链表的简单Java实现-sunziren

写在前面,csdn的那篇同名博客就是我写的,我把它现在在这边重新发布,因为我实在不想用csdn了,那边的广告太多了,还有就是那个恶心人的"阅读更多"按钮,惹不起我躲得起. 最近面试的过程中,发现有的公司的面试题考到了链表的逆序,这一块我正好不是特别清楚.于是打算把链表这一块好好的学习学习.在网上搜寻了众多的资料以后,了解到链表的核心是节点与节点之间的互相链接. 于是自己也写了一个单向链表的类,里面包括input插入方法,inputById按指定下标插入方法,deleteAll删除所有节

RabbitMQ学习及实践2---介绍及简单Java实现

一,基本概念 MQ是消费-生产者模型的一个典型的代表,一端往消息队列中不断写入消息,而另一端则可以读取或者订阅队列中的消息.MQ和JMS类似,但不同的是JMS是SUN JAVA消息中间件服务的一个标准和API定义,而MQ则是遵循了AMQP协议的具体实现和产品. RabbitMQ是一个在AMQP基础上完整的,可复用的企业消息系统.他遵循Mozilla Public License开源协议. RabbitMQ是流行的开源消息队列系统,用erlang语言开发.RabbitMQ是AMQP(高级消息队列协

Ant——使用Ant构建简单Java项目(二)

博客<Ant--使用Ant构建简单Java项目(一)>演示了使用Ant工具构建简单的Java项目,接着这个例子来进一步学习Ant: 上面例子执行build.xml文件脚本比较繁杂,能不能简化执行的脚本呢?答案是肯定的,可以将build.xml文件中的脚本改成下面的脚本: <?xml version="1.0" encoding="UTF-8"?> <project name="test" default="

输出多行字符的一个简单JAVA小程序

1 public class JAVA 2 { 3 public static void main(String[] args) 4 { 5 System.out.println("----------------------"); 6 System.out.println("|| 我要学会 ||"); 7 System.out.println("|| JAVA语言 ||"); 8 System.out.println("-------

Ant——使用Ant构建简单Java项目(三)

博客<Ant--使用Ant构建简单Java项目(二)>我们简化了执行Test类中main方法需要执行的命令,本博客来介绍一下如何使build.xml文件和其中使用property标签定义的属性分离: 1.在test文件夹中新建名为build.properties的文件,文件中以"key=value"的形式输入原来在build.xml文件中定义的属性及其属性值如下: src=src lib=build/lib dest=build/classes np_jar=build/l

_00019 Storm的体系结构介绍以及Storm入门案例(官网上的简单Java案例)

博文作者:妳那伊抹微笑 博客地址:http://blog.csdn.net/u012185296 个性签名:世界上最遥远的距离不是天涯,也不是海角,而是我站在妳的面前,妳却感觉不到我的存在 技术方向:Flume+Kafka+Storm+Redis/Hbase+Hadoop+Hive+Mahout+Spark ... 云计算技术 转载声明:可以转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明,谢谢合作! qq交流群:214293307  (期待与你一起学习,共同进步) # Storm

Ant—使用Ant构建简单Java项目(三)

博客<Ant-使用Ant构建简单Java项目(二)>我们简化了运行Test类中main方法须要运行的命令,本博客来介绍一下如何使build.xml文件和当中使用property标签定义的属性分离: 1.在test目录中新建名为build.properties的文件,文件里以"key=value"的形式输入原来在build.xml文件里定义的属性及其属性值例如以下: src=src lib=build/lib dest=build/classes np_jar=build/l

Java基础_3.5:简单Java类

简单Java类 简单Java类是一种在实际开发之中使用最多的类的定义形式,在简单Java类中包含有类.对象.构造方法.private封装等核心概念的使用,而对于简单Java类首先给出如下的基本开发要求: 类名称必须存在有意义,例如:Book.Emp: 类之中所有的属性必须private封装,封装后的属性必须提供有setter.getter: 类之中可以提供有任意多个构造方法,但是必须保留有一个无参构造方法: 类之中不允许出现任何的输出语句,所有信息输出必须交给被调用处输出: 类之中需要提供有一个

JAVA基础学习之路(四)定义简单java类

简单java类开发一般原则: 类名称必须有意义,再怎么说,要让人家看的明白吧 类之中所有属性必须使用private封装,并提供setter,getter方法 类之中可以有多个构造方法,但是必须保留有一个无参数构造方法 类之中不允许出现任何输出语句,所有输出必须交给被调用处 类之中需要有一个可以取得对象完整信息的方法,一般叫做getInfo(),返回String型数据 class Book { private String name; private int price; private int