• 双向链表的实现


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

    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;
    		
    		
    	}
    
    }
    
  • 相关阅读:
    the schema version of 'microsoft.aspnet.mvc' is incompatible with version of nuget
    ODBC连接到400
    PC端使用program來CHGUSRPRF
    Could not load file or assembly 'System.Data.SQLite' or one of its dependencies. An attempt was made
    编辑器,按钮等等,图片上传到服务器的原理-----图片上传预览原理及实现
    dedecms,ajax提交,前端验证,前端提示,以及30秒后再提交
    js提交表单的时候,30秒后才能提交第二次
    z-dialog下载,以及使用教程---下载zdialog以后,有案例,那里才是官方最全的教程
    Resource interpreted as Stylesheet but transferred with MIME type application/javascript
    dedecms ajax表单提交,以及如何返回json的数据,以及数组的写法
  • 原文地址:https://www.cnblogs.com/lanqie/p/7442868.html
Copyright © 2020-2023  润新知