您的位置:首页 > 理论基础 > 数据结构算法

Java 实现双链表数据结构

2018-02-03 13:02 323 查看
首先,双链表也是链表的一种;与单链表不同的是,他不仅有着当前节点下一个节点的指针,也存有当前节点上一个节点的指针,这样就形成了一种循环的链表结构。对于双链表,增加新的节点或者删除某个节点十分非常方便的,只需要修改所在相关节点前后节点的指针指向就可以了。所以对于双链表中的任何一个节点都有着三个元素:上一个节点的指针,下一个节点的指针以及当前节点所存储的对象。下边是java如何实现双链表结构:

public class DoubleLink<T>{

private DNode mHead;//链表头
private int mcount;//节点数目

private class DNode<T>{
public DNode pre;
public DNode next;
public T value;

public DNode(T value,DNode pre,DNode next){
this.pre=pre;
this.next=next;
this.value=value;
}
}

public DoubleLink(){
mHead =new DNode<T>(null,null,null);
mHead.pre=mHead.next=mHead;
mcount=0;
}

public int getSize(){
return mcount;
}

public boolean isEmpty(){
return mCount==0;
}

public T get(int index){
return getNode(index).value;
}

public T getNode(int index){
if(index<0||index>=mCount){
throw new IndexOutOfBoundsException();
}

if(index<=mCount/2){
DNode<T> node =mHead.next;
for(int i=0;i<index;i++){
node=node.next;
}
return node;
}

DNode<T> rNode = mHead.pre;
int rIndex = mCount-index-1;
for(int j=0;j<rIndex;j++){
rNode=rNode.pre;
}

return rNode;
}

public void insert(int index,T value){
if(index==0){
DNode node = new DNode<T>(value,mHead,mHead.next);
mHead.next=node;
node.next.pre=node;
mCount++;
return;
}

DNode iNode =getNode(index);
DNode tNode = new DNode<T>(value,iNode.pre,iNode);
iNode.pre.next=tNode;
iNode.pre=tNode;
mCount++;
return;
}

public void insertFirst(T value){
insert(0,value);
}

public void appendLast(T value){
DNode node = new DNode<T>(value,mHead.pre,mHead);
mHead.pre.next=node;
mHead.pre=node;
mcount++;
}

public void remove(int index){
DNode node =getNode(index);
node.pre.next=node.next;
node.next.pre=node.pre;
node=null;
mCount--;
}

public void removeFirst(){
remove(0);
}

public void removeLast(){
remove(mCount-1);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: