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

    package linkedList;
    
    public class DoubleLinkedListDemo {
    
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		System.out.println("双向链表的测试!");
    		HeroNode2 hero1=new HeroNode2(1, "宋江", "及时雨");
    		HeroNode2 hero2=new HeroNode2(2, "卢俊义", "玉麒麟");
    		HeroNode2 hero3=new HeroNode2(3, "吴用", "智多星");
    		HeroNode2 hero4=new HeroNode2(4, "林冲", "豹子头");
    		
    		DoubleLinkedList doubleLinkedList=new DoubleLinkedList();
    		doubleLinkedList.add(hero1);
    		doubleLinkedList.add(hero4);
    		doubleLinkedList.add(hero3);
    		doubleLinkedList.add(hero2);
    		doubleLinkedList.list();
    		System.out.println("更新~~~~~~~~~~~~~~~~");
    		HeroNode2 hero5=new HeroNode2(4, "公孙胜", "入云龙");
    		doubleLinkedList.upDate(hero5);
    		doubleLinkedList.list();
    		System.out.println("删除~~~~~~~~~~~~~~~~~");
    		doubleLinkedList.delNodeById(3);
    		doubleLinkedList.list();
    	}
    
    }
    //定义双向链表节点
    class DoubleLinkedList
    {
    	private HeroNode2 head=new HeroNode2(0, "", "");
    	
    	//遍历双向链表
    	public void list()
    	{
    		//先判断列表是否为空
    		if(head.next==null)
    		{
    			return;
    		}
    		//因为头结点不能动,因此需要一个辅助变量来变量
    		HeroNode2 temp=head.next;
    		while(true)
    		{
    			if(temp==null)//如果为空
    			{
    				break;
    			}
    			else
    			{
    				//输出节点的信息
    				System.out.println(temp);
    				//将temp后移
    				temp=temp.next;
    			}
    		}
    	}
    	
    	//添加
    	public void add(HeroNode2 heroNode)
    	{
    		//head节点不可以动,因此我们需要一个辅助遍历temp
    		HeroNode2 temp=head;
    		//遍历链表找到,找到最后
    		while(true)
    		{
    			//当什么情况下,说明链表带最后了
    			if(temp.next==null)
    			{
    				break;
    			}
    			//如果没有找到,就将指针后移
    			temp=temp.next;
    		}
    		//当到达了双向链表的最后
    		temp.next=heroNode;
    		heroNode.pre=temp;
    	}
    	
    	//删除一个节点
    	public void delNodeById(int id)
    	{
    		if(head.next==null)
    		{
    			System.out.println("链表为空,无法删除该节点!");
    		}
    		else
    		{
    			HeroNode2 temp=head.next;
    			boolean flag=false;//没有找到要删除的节点
    			while(true)
    			{
    				if(temp==null)
    				{
    					break;
    				}
    				if(temp.no==id)
    				{
    					flag=true;//说明找到了
    					break;
    				}
    				temp=temp.next;
    			}
    			if(flag)
    			{
    				if(temp.next==null)
    				{
    					temp.pre.next=temp.next;
    				}
    				else
    				{
    					temp.pre.next=temp.next;
    					temp.next.pre=temp.pre;//这里代码存在问题,如果是最后一个节点不应该出现这句话,否则会出现空指针异常
    				}
    			
    			}
    			else
    			{
    				System.out.println("没有找到要删除的节点!");
    			}
    				
    		}
    	}
    	
    	//更新链表
    	public void upDate(HeroNode2 newHeroNode)//根据新节点的编号来修改
    	{
    		//判断链表是不是为空
    		if(head.next==null)
    		{
    			System.out.println("链表为空!");
    			return;
    		}
    		//定义一个辅助变量
    		HeroNode2 temp=head.next;
    		boolean flag=false;//是否找到节点
    		while(true)
    		{
    			if(temp==null)//到了链表的最后
    			{
    				break;
    			}
    			if(temp.no==newHeroNode.no)
    			{
    				flag=true;
    				break;
    			}
    			temp=temp.next;
    		}
    		//根据flag来判断是否找到要修改的节点
    		if(flag)
    		{
    			temp.name=newHeroNode.name;
    			temp.nickName=newHeroNode.nickName;
    		}
    		else//没有找到
    		{
    			System.out.printf("没有找到编号%d的节点,不能修改!",newHeroNode.no);
    		}
    	}
    	
    	//按照顺序来添加英雄
    	//第二种添加英雄的方法通过id的顺序来添加英雄
    	public void addByOrder(HeroNode2 heroNode)
    		{
    		//由于头结点不能用,依旧通过一个辅助节点来进行插入遍历
    		//要找的temp是添加位置的前一个节点
    		HeroNode2 temp=head;
    		boolean flag=false;//添加编号是否存在,默认为false
    		while(true)
    		{
    			if(temp.next==null)//说明已经到最后
    			{
    				break;
    			}
    			if(temp.next.no>heroNode.no)//插入的位置找到了,就在temp的后面插入
    			{
    				break;
    			}
    			else if(temp.next.no==heroNode.no)
    			{
    				flag=true;
    				break;
    			}
    			temp=temp.next;//后移,也就是
    		}
    		//判断flag的值
    		if(flag)//说明编号已经存在,不能在添加
    		{
    			System.out.printf("准备插入的英雄编号%d已经存在!
    ",heroNode.no);
    		}
    		else
    		{
    			//插入到链表中
    			heroNode.next=temp.next;
    			heroNode.pre=temp;
    			temp.next.pre=heroNode;
    			temp.next=heroNode;
    		}
    		
    		}
    	
    }
    
    
    
    
    //定义一个HeroNode,每个HeroNode对象就是一个节点
    class HeroNode2
    {
    	public int no;
    	public String name;
    	public String nickName;
    	public HeroNode2 next;//指向下一个节点,初始化为null
    	public HeroNode2 pre;//指向前一个节点,初始化为null
    	
    	//构造器
    	public HeroNode2(int no,String name,String nickName)
    	{
    		this.no=no;
    		this.nickName=nickName;
    		this.name=name;
    	}
    	//为了显示方便,重写toString方法
    
    	@Override
    	public String toString() 
    	{
    		return "HeroNode [no=" + no + ", name=" + name + ", nickName=" + nickName+ "]";
    	}
    	
    }
    

      

  • 相关阅读:
    20155302 课堂实践二
    20155302 课堂实践
    2017-2018-1 20155302 《信息安全系统设计基础》第6周学习总结
    2017-2018-1 20155302 《信息安全系统设计基础》第5周学习总结
    2017-2018-1 20155302 《信息安全系统设计基础》第四周学习总结
    2017-2018-1 20155301 《信息安全系统设计基础》第九周学习总结
    课下作业和课上作业
    2017-2018-1 20155301 《信息安全系统设计基础》第八周学习总结
    信息安全系统设计基础实验二
    信息安全系统设计基础第二次实验
  • 原文地址:https://www.cnblogs.com/mengxiaoleng/p/11197308.html
Copyright © 2011-2022 走看看