Java 实现双链表数据结构

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值