Java双链表编程练习

问题

实现一个嵌套类DoubleNode用来构造双向链表,其中每个结点都含有一个指向前驱元素的引用和一个指向后续元素的引用(如果不存在则为null)。
为以下任务实现若干静态方法:

在头插入结点

在表尾插入结点

从表头删除结点

从表尾删除结点

在指定结点前插入新结点

在指定结点之后插入新结点

删除指定结点

代码:

package test;

public class DoubleList<Item> {
	public static class DoubleNode<Item>
	{
		public Item item;
		public DoubleNode<Item> next;//下一个节点
		public DoubleNode<Item> prev;//上一个节点
	}

	private DoubleNode<Item> first;
	private DoubleNode<Item> last;
	
	public DoubleList()
	{//构造函数,初始化链表
		first=null;
		last=null;
	}
	
	public static<Item> void insertAsFirst(DoubleList<Item> d1, Item e)
	{
		DoubleNode<Item> nodenew= new DoubleNode<Item>();
		nodenew.item=e;
		nodenew.next=d1.first;
		nodenew.prev=null;
		if(d1.first==null)
			d1.last=nodenew;
		else
			d1.first.prev=nodenew;
		d1.first=nodenew;	
	}
	
	public static<Item> void insertAsLast(DoubleList<Item> d1,Item e)
	{
		DoubleNode<Item> nodenew=new DoubleNode<Item>();
		nodenew.item=e;
		nodenew.prev=d1.last;
		nodenew.next=null;
		if(d1.last==null)
			d1.first=nodenew;
		else
			d1.last.next=nodenew;
		d1.last=nodenew;	
	}
	
	public static<Item> void deleteFirst(DoubleList<Item> d1)
	{
		if(d1.first==null)
			return;
		if(d1.first==d1.last)
		{
			d1.first=null;
			d1.last=null;
		}
		else
		{
			d1.first=d1.first.next;
			d1.first.prev.next=null;//释放连接
			d1.first.prev=null;	
		}
	}
	
	public static<Item> void deleteLast(DoubleList<Item> d1)
	{
		if(d1.last==null)
			return;
		if(d1.last==d1.first)
		{
			d1.first=null;
			d1.last=null;
		}
		else
		{
			d1.last=d1.last.prev;
			d1.last.next.prev=null;
			d1.last.next=null;
		}
	}
	
	public static<Item> void insertBefore(DoubleList<Item> d1,DoubleNode<Item> node, Item e)
	{
		if(node==null) return;
		if(d1.first==node) insertAsFirst(d1,e);
		else
		{
			DoubleNode<Item> nodenew=new DoubleNode<Item>();
			nodenew.item=e;
			nodenew.next=node;
			nodenew.prev=node.prev;
			node.prev.next=nodenew;
			node.prev=nodenew;//这个容易忘
		}
	}
	
	public static<Item> void insertAfter(DoubleList<Item> d1,DoubleNode<Item> node, Item e)
	{
		if(node==null) return;
		if(d1.last==node) insertAsLast(d1,e);
		else
		{
			DoubleNode<Item> newnode=new DoubleNode<Item>();
			newnode.item=e;
			newnode.prev=node;
			newnode.next=node.next;
			node.next.prev=newnode;
			node.next=newnode;
			
		}
	}
	
	public static<Item> void deleteNode(DoubleList<Item> d1,DoubleNode<Item> node)
	{
		if(node==null) return;
		else if(node==d1.first) deleteFirst(d1);
		else if(node==d1.last) deleteLast(d1);
		else
		{
			node.prev.next=node.next;
			node.next.prev=node.prev;
			node.prev=null;//释放连接
			node.next=null;//释放连接
		}
	}
	
	public static<Item> DoubleNode<Item> search(DoubleList<Item> d1,Item e)
	{ 
		DoubleNode<Item> newnode=d1.first;
		while(newnode!=null)
		{
			if(newnode.item.equals(e))
				return newnode;
			newnode=newnode.next;
		}
		return null;
	}
	
	public static<Item> void print(DoubleList<Item> d1)
	{
		DoubleNode<Item> newnode=d1.first;
		while(newnode!=null)
		{
			System.out.println(newnode.item);
			newnode=newnode.next;
		}
	}
	
}

测试代码:

package test;

public class Q100331 {
	public static void testInsertAsFirst()
	{
        System.out.println("--------------------");
        System.out.println("testInsertAsFirst:");
        DoubleList<String> dl = new DoubleList<String>();
        DoubleList.insertAsFirst(dl, "a");
        DoubleList.insertAsFirst(dl, "b");
        DoubleList.insertAsFirst(dl, "c");
        DoubleList.insertAsFirst(dl, "d");
        System.out.println("After insert a, b, c, d:");
        DoubleList.print(dl);
	}
    public static void testInsertAsLast()
    {
        System.out.println("--------------------");
        System.out.println("testInsertAsLast:");
        DoubleList<String> dl = new DoubleList<String>();
        DoubleList.insertAsLast(dl, "a");
        DoubleList.insertAsLast(dl, "b");
        DoubleList.insertAsLast(dl, "c");
        DoubleList.insertAsLast(dl, "d");
        System.out.println("After insert a, b, c, d:");
        DoubleList.print(dl);
    }
    
   public static void testInsertAsFirstAndLast()
   {
       System.out.println("--------------------");
       System.out.println("testInsertAsFirstAndLast:");
       DoubleList<String> dl = new DoubleList<String>();
       DoubleList.insertAsLast(dl, "a");
       DoubleList.insertAsLast(dl, "b");
       DoubleList.insertAsLast(dl, "c");
       DoubleList.insertAsLast(dl, "d");
       DoubleList.insertAsFirst(dl, "1");
       DoubleList.insertAsFirst(dl, "2");
       DoubleList.insertAsFirst(dl, "3");
       DoubleList.insertAsFirst(dl, "4");
       System.out.println("After insertAsLast a, b, c, d and insertAsFirst 1, 2, 3, 4:");
       DoubleList.print(dl);
   }
     
   public static void testDeleteFirst()
   {
       System.out.println("--------------------");
       System.out.println("testDeleteFirst:");
       DoubleList<String> dl = new DoubleList<String>();
       DoubleList.insertAsLast(dl, "a");
       DoubleList.insertAsLast(dl, "b");
       DoubleList.insertAsLast(dl, "c");
       DoubleList.insertAsLast(dl, "d");
       System.out.println("list is: ");
       DoubleList.print(dl);
       System.out.println("After deleteFrist:");
       DoubleList.deleteFirst(dl);
       DoubleList.print(dl);
       
       System.out.println("After deleteFrist again:");
       DoubleList.deleteFirst(dl);
       DoubleList.print(dl);
       
       System.out.println("After deleteFrist again:");
       DoubleList.deleteFirst(dl);
       DoubleList.print(dl);
       
       System.out.println("After deleteFrist again:");
       DoubleList.deleteFirst(dl);
       DoubleList.print(dl);
       
       System.out.println("After deleteFrist again:");
       DoubleList.deleteFirst(dl);
       DoubleList.print(dl);
   }
   
   public static void testDeleteLast()
   {
       System.out.println("--------------------");
       System.out.println("testDeleteLast:");
       DoubleList<String> dl = new DoubleList<String>();
       DoubleList.insertAsLast(dl, "a");
       DoubleList.insertAsLast(dl, "b");
       DoubleList.insertAsLast(dl, "c");
       DoubleList.insertAsLast(dl, "d");
       System.out.println("list is: ");
       DoubleList.print(dl);
       System.out.println("After deleteLast:");
       DoubleList.deleteLast(dl);
       DoubleList.print(dl);
       
       System.out.println("After deleteLast again:");
       DoubleList.deleteLast(dl);
       DoubleList.print(dl);
       
       System.out.println("After deleteLast again:");
       DoubleList.deleteLast(dl);
       DoubleList.print(dl);
       
       System.out.println("After deleteLast again:");
       DoubleList.deleteLast(dl);
       DoubleList.print(dl);
       
       System.out.println("After deleteLast again:");
       DoubleList.deleteLast(dl);
       DoubleList.print(dl);
   }
    
   public static void testSearch()
   {
       System.out.println("--------------------");
       System.out.println("testSearch:");
       DoubleList<String> dl = new DoubleList<String>();
       DoubleList.insertAsFirst(dl, "a");
       DoubleList.insertAsFirst(dl, "b");
       DoubleList.insertAsFirst(dl, "c");
       DoubleList.insertAsFirst(dl, "d");
       
       System.out.println("List is :");
       DoubleList.print(dl);
       
       DoubleList.DoubleNode<String> node = DoubleList.search(dl, "c");
       System.out.println("Search c: ");
       if (node != null)
       {
           System.out.println("Find " + node.item);
       }
       else
       {
           System.out.println("Not found");
       }
               
       node = DoubleList.search(dl, "d");
       System.out.println("Search d: ");
       if (node != null)
       {
           System.out.println("Find " + node.item);
       }
       else
       {
           System.out.println("Not found");
       }
       
       node = DoubleList.search(dl, "a");
       System.out.println("Search a: ");
       if (node != null)
       {
           System.out.println("Find " + node.item);
       }
       else
       {
           System.out.println("Not found");
       }
        
       node = DoubleList.search(dl, "x");
       System.out.println("Search x: ");
       if (node != null)
       {
           System.out.println("Find " + node.item);
       }
       else
       {
           System.out.println("Not found");
       }
   }
   
   public static void testInsertBeforeAndAfter()
   {
       System.out.println("--------------------");
       System.out.println("testInsertBeforeAndAfter:");
       DoubleList<String> dl = new DoubleList<String>();
       DoubleList.insertAsLast(dl, "a");
       DoubleList.insertAsLast(dl, "b");
       DoubleList.insertAsLast(dl, "c");
       DoubleList.insertAsLast(dl, "d");
       
       System.out.println("List is :");
       DoubleList.print(dl);
       
       DoubleList.DoubleNode<String> node = DoubleList.search(dl, "c");
       DoubleList.insertAfter(dl, node, "C");
       System.out.println("After insert C after c:");
       DoubleList.print(dl);
       
       node = DoubleList.search(dl, "d");
       DoubleList.insertAfter(dl, node, "D");
       System.out.println("After insert D after d:");
       DoubleList.print(dl);
       
       node = DoubleList.search(dl, "c");
       DoubleList.insertBefore(dl, node, "B");
       System.out.println("After insert B before c:");
       DoubleList.print(dl);
       
       node = DoubleList.search(dl, "a");
       DoubleList.insertBefore(dl, node, "A");
       System.out.println("After insert A before a:");
       DoubleList.print(dl);
   }
    
   public static void testDeleteNode()
   {
       System.out.println("--------------------");
       System.out.println("testDeleteNode:");
       DoubleList<String> dl = new DoubleList<String>();
       DoubleList.insertAsLast(dl, "a");
       DoubleList.insertAsLast(dl, "b");
       DoubleList.insertAsLast(dl, "c");
       DoubleList.insertAsLast(dl, "d");
       
       System.out.println("List is :");
       DoubleList.print(dl);
       
       DoubleList.DoubleNode<String> node = DoubleList.search(dl, "c");
       DoubleList.deleteNode(dl, node);
       System.out.println("After delete c:");
       DoubleList.print(dl);
       
       node = DoubleList.search(dl, "a");
       DoubleList.deleteNode(dl, node);
       System.out.println("After delete a:");
       DoubleList.print(dl);

       node = DoubleList.search(dl, "d");
       DoubleList.deleteNode(dl, node);
       System.out.println("After delete d:");
       DoubleList.print(dl);
   }
  
   
   public static void main(String[] args)
   {
//       testInsertAsFirst();
//       testInsertAsLast();
//       testInsertAsFirstAndLast();
//       testDeleteFirst();
//       testDeleteLast();
//       testSearch();
         testInsertBeforeAndAfter();
//       testDeleteNode();
   }
}

参考:大神博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值