双向链表的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());
}
}
}
//遍历节点的方法2
public 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));
}
}
希望大家不明白的,可以看看源码,如果不是很明白的可以看看双向链表的原理,多多画画图,就很明白了,但是代码还是要自己写写的。