双向链表的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
原创粉丝点击