zoukankan      html  css  js  c++  java
  • 双向链表的实现

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

    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;
    		
    		
    	}
    
    }
    
  • 相关阅读:
    Vue 封装axios(四种请求)及相关介绍
    简单的按钮样式,两个连在一起的按钮
    http接口访问正常,https访问报错,基础连接已经关闭: 发送时发生错误.
    单点登录思路,多台服务器共用一个数据库,登录信息解决方案
    Wait()在过滤器中卡住 ,在异步代码上阻塞时的常见死锁问题
    接口对接,接口通过原有代码无法访问,解决办法,用postman解决
    svg基础标签说明
    server 2016部署网络负载平衡(NLB)
    写 JS 逻辑判断,不要只知道用 if-else 和 switch
    .NetCore部署IIS出错原因未安装ASP.N.NetCore部署IIS出错原因未安装ASP.NET Core Module v2ET Core Module v2
  • 原文地址:https://www.cnblogs.com/lanqie/p/7442868.html
Copyright © 2011-2022 走看看