双向链表的Java实现,以及相关函数的实现
来源:互联网 发布:淘宝产品图片尺寸留白 编辑:程序博客网 时间:2024/06/15 14:01
双向链表的Java具体实现,下面的代码是可以正常使用的。
1.创建节点类
package com.wpl.doublelink;public class Node {//存储的数据private Object data;//前一个节点private Node prev;//后一个节点private Node next;public Object getData() {return data;}public void setData(Object data) {this.data = data;}public Node getPrev() {return prev;}public void setPrev(Node prev) {this.prev = prev;}public Node getNext() {return next;}public void setNext(Node next) {this.next = next;}//定义构造函数public Node(){}public Node(Object data, Node prev, Node next) {super();this.data = data;this.prev = prev;this.next = next;}}
2.链表的具体实现
package com.wpl.doublelink;//实现双向链表public class myDoubleLinkImpl {//记录链表的节点数int length=0;//定义上一个节点private Node header;//定义下一个节点private Node tail;public myDoubleLinkImpl(){//定义的一个空的链表header=null;tail=null;length=0;}//获取链表的节点值public int getLength(){return length;}//向链表中添加值public void add(Object data){//判断链表是否是空的哈if(header==null){header=new Node(data,null,null);tail=header;length++;}else{//非空链表哈Node tempNode=new Node(data,tail,null);tail.setNext(tempNode);tail=tempNode;length++;}}//获取特定的index的节点public Node getNodeByIndex(int index){//根据索引的值不同是选择是从后向前查找还是//选择从前往后查找if(index<0||index>length-1){throw new IndexOutOfBoundsException("索引超出了边界!");}else if(index<=length/2){Node current=header;for(int i=0;i<length&¤t!=null;i++,current=current.getNext()){if(index==i){return current;}}}else if(index>length/2){Node current=tail;for(int i=length-1;i>=0&¤t!=null;i--,current=current.getPrev()){if(index==i){return current;}}}return null;}public Node getNodeByIndex_new(int index){if(index<0||index>length-1){throw new IndexOutOfBoundsException("索引超出了边界!");}else{Node current=header;for(int i=0;i<length&¤t!=null;i++,current=current.getNext()){if(index==i){return current;}}}return null;}//根据节点获取节点所在的值哈public Object getDataByIndex(int index){return getNodeByIndex(index).getData();}//遍历节点的值哈public void allPrint(){if(header==null){throw new NullPointerException("链表为空");}else{for(int i=0;i<length;i++){Node current=getNodeByIndex_new(i);System.out.println(current.getData());}}}//遍历节点的方法2public void allPrint_New(){if(header==null){throw new NullPointerException("链表为空");}else{Node current=tail;while(current!=null){System.out.println(current.getData());current=current.getPrev();}}}//在特定的位置上插入一个数据哈public void insertDataByIndex(Object data,int index){//在特定的位置上面插入一个节点哈if(index>length-1||index<0){throw new IndexOutOfBoundsException("索引超出了边界!");}else if(header==null){add(data);length++;}else if(index==0){Node current=new Node(data, null, header);header=current;header.setPrev(current);length++;}else{//获取前一个节点哈Node prevNode=getNodeByIndex(index-1);Node current=new Node(data, prevNode, prevNode.getNext());prevNode.getNext().setPrev(current);prevNode.setNext(current);length++;}}//删除某一个特定的index的节点public void delNodeByIndex(int index){if(index>length-1||index<0){throw new IndexOutOfBoundsException("索引超出了边界!");}else if(header==null){throw new NullPointerException("链表为空!");}else if(index==0){//如果删除的是头节点时候Node current =header.getNext();current.setPrev(null);header=current;length--;}else if(index==length-1){//如果删除的是最后一个节点的话。//获取前一个节点Node prevNode=getNodeByIndex(index-1);//修改前一个节点的next节点Node del=prevNode.getNext();prevNode.setNext(del.getNext());tail=prevNode;length--;}else{//删除一般的节点的//获取前一个节点Node prevNode=getNodeByIndex(index-1);//修改前一个节点的next节点Node del=prevNode.getNext();prevNode.setNext(del.getNext());if(del.getNext()!=null){del.getNext().setPrev(prevNode);}del.setNext(null);del.setPrev(null);length--;}}public static void main(String[] args) {myDoubleLinkImpl mytest=new myDoubleLinkImpl();mytest.add("12334");mytest.add("wangpeili");mytest.add(123);mytest.add("test");mytest.insertDataByIndex("here", 3);mytest.insertDataByIndex("here2", 3);System.out.println("++++++++++++删除前++++++++++++");mytest.allPrint();mytest.delNodeByIndex(5);System.out.println("++++++++++++删除后++++++++++++");mytest.allPrint();//mytest.allPrint_New();//System.out.println(mytest.getLength());System.out.println("++++++++++++取值+++++++++++++");System.out.println(mytest.getDataByIndex(3));}}
希望大家不明白的,可以看看源码,如果不是很明白的可以看看双向链表的原理,多多画画图,就很明白了,但是代码还是要自己写写的。
0 0
- 双向链表的Java实现,以及相关函数的实现
- 单向链表的Java实现,以及相关函数。
- Java 单链表的反转 以及 双向链表的实现
- 双向循环链表 函数的实现
- Java双向队列,用双向链表实现的
- java实现双向链表的操作
- Java双向链表的实现
- 双向链表的Java实现
- Java双向链表的实现
- java中双向链表的实现
- java的双向链表简单实现
- 双向链表的java实现
- Java双向链表的实现
- 双向链表的相关操作C++实现
- 双向链表的相关操作--C语言实现
- 双向链表的相关操作C++实现
- 双向链表的相关操作C++实现
- 数组、单链表和双链表介绍 以及 双向链表的C/C++/Java实现
- C#学习之方法
- 剑指offer-算法题练习:part19 树的子结构
- Python 抽象
- poj-3159【差分约束+Dijkstra算法的优化】
- 排序总结系列二:直接插入排序
- 双向链表的Java实现,以及相关函数的实现
- 【工控安全产品】工业控制系统信息安全检查工具箱
- [Android]XML和JSON的区别
- Zhu and 772002
- 某个个人公众号阅读量和点赞数分析
- Http协议详解
- 在ubuntu中添加widows启动项的简单方法
- C++ 模板类
- android快速开发框架,集成了底部tab键切换界面、toolbar、沉浸式状态栏、BaseActivity、BaseAdapter、BaseFragment等