双向链表的Java实现,以及相关函数的实现


双向链表的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));
	}
	
	
}

希望大家不明白的,可以看看源码,如果不是很明白的可以看看双向链表的原理,多多画画图,就很明白了,但是代码还是要自己写写的。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值