双向链表的实现

最近在看《算法》,这是课后的一道关于双向链表习题的解决方案。

package com.xh.node;
/**
 * 实现双向链表
 * @author kali
 *
 */

public class TwoLink<Item>{
	//链表开始节点
	private DoubleNode first;
	//链表最后节点
	private DoubleNode last;
	//链表节点数
	private int num;
	
	
	public boolean isEmpty()
	{
		return num==0;
	}
	
	public int size()
	{
		return num;
	}
	
	//在第一个节点前加一个
	public void addFirst(Item item)
	{	if(num==0)
		{
			first=new DoubleNode();
			first.item=item;
			last=first;
			num++;
		}
		else
		{
			DoubleNode oldFirst=first;
			first=new DoubleNode();
			first.item=item;
			first.next=oldFirst;
			oldFirst.previous=first;
			num++;
		}

	}
	
	//删除第一个节点
	public Item delFirst()
	{
		if(isEmpty()) return null;
		Item item=first.item;
		first=first.next;
		num--;
		return item;
	}
	
	//在最后节点前加一个
	public void addLast(Item item)
	{	
		if(num==0)
		{
			last=new DoubleNode();
			last.item=item;
			first=last;
			num++;
		}
		else
		{
			DoubleNode oldLast=last;
			last=new DoubleNode();
			last.item=item;
			last.previous=oldLast;
			oldLast.next=last;
			num++;
		}
		
	}
	
	//删除最后一个节点
	public Item delLast()
	{
		if(isEmpty()) return null;
		Item item=last.item;
		last=last.previous;
		num--;
		return item;
	}
	
	//在指定节点前增加
	public void add2Before(Item item,Item newitem)
	{
		 DoubleNode node= getNode(item, first);
		 DoubleNode newnode=new DoubleNode();
		 
		 newnode.item=newitem;
		 if(node!=null)
		 {	 DoubleNode before=node.previous;
		 	 before.next=newnode;//重点
			 newnode.previous=node.previous;
			 newnode.next=node;
			 node.previous=newnode;
			 num++;
		 }
	}
	
	//在指定节点后增加
	public void add2Last(Item item,Item newitem)
	{	
		 DoubleNode node= getNode(item, first);
		 DoubleNode newnode=new DoubleNode();
		 
		 newnode.item=newitem;
		 if(node!=null)
		 {	 DoubleNode after=node.next;
		 	 after.previous=newnode;//重点
			 newnode.next=node.next;
			 newnode.previous=node;
			 node.next=newnode;
			 num++;
		 }
		
	}
	
	//删除指定节点
	public void del2It(Item item)
	{
		 DoubleNode node= getNode(item, first);
		 
		 if(node!=null)
		 {	 DoubleNode before=node.previous;
		 	 DoubleNode after=node.next;
		 	 after.previous=before;
		 	 before.next=after;
			 num--;
		 }
	}
	
	
	//查询所有元素
	public String getAll(DoubleNode f)
	{
		
		String all="";
		if(f!=null)
		{
			all=f.item.toString();
			all+=getAll(f.next);
		}
		return all;
	}
	
	
	//查询指定元素节点
	public DoubleNode getNode(Item item,DoubleNode f)
	{
		DoubleNode node=f;
		
		if(f!=null)
		{
			if(node.item.equals(item))
			{
				return node;
			}
			else{
				//这样高效,不要在else{}外面return;
				return getNode(item,f.next);
			}
			
			
		}else{
			return null;
		}
		
	
	}
	
	

	public static void main(String[] args) {
		TwoLink<String> twoLink=new TwoLink<>();
		twoLink.addFirst("a");
		twoLink.addFirst("b");
		twoLink.addFirst("c");
		twoLink.addFirst("d");
		twoLink.addFirst("e");
		twoLink.addFirst("f");
		twoLink.addFirst("g");
		twoLink.addFirst("h");
		
		twoLink.addLast("1");
		twoLink.addLast("2");
		twoLink.addLast("3");
		
		
		System.out.println(twoLink.num);
		//System.out.println(twoLink.delFirst());
		System.out.println(twoLink.delLast());
		System.out.println(twoLink.num);
		System.out.println(twoLink.getAll(twoLink.first));
		System.out.println(twoLink.num);
		System.out.println(twoLink.getNode("2",twoLink.first));
		twoLink.add2Before("2", "4");
		twoLink.add2Last("2", "5");
		twoLink.del2It("2");
		System.out.println(twoLink.getAll(twoLink.first));

	}
	
	
	//定义节点
	private class DoubleNode {

		//当前节点前一个
		private DoubleNode previous;
		//当前节点后一个
		private DoubleNode next;
		//当前节点的内容
		private Item item;
		
		
	}

}
原文地址:https://www.cnblogs.com/lanqie/p/7442868.html