zoukankan      html  css  js  c++  java
  • 单向链表的增删查改

    链表(Linked List)

    链表是有序的列表

    链表是以节点的方式来存储,是链式存储

    每个节点包含data域,next域;指向下一个节点

    链表的各个节点不一定是连续存储

    链表分带头节点的链表和没有头节点的链表,根据实际需求来确定

    单链表的增删改查

    package linkedlist;
    
    import javax.swing.plaf.synth.SynthSeparatorUI;
    
    public class SingleLinkedListDemo {
    	public static void main(String[] args) {
    		//进行测试
    		HeroNode hero1 = new HeroNode(1,"宋江","及时雨");
    		HeroNode hero2 = new HeroNode(2,"卢俊义","玉麒麟");
    		HeroNode hero3 = new HeroNode(3,"吴用","智多星");
    		HeroNode hero4 = new HeroNode(4,"林冲","豹子头");
    		SingleLinkedList sl = new SingleLinkedList();
    //		sl.add(hero1);
    //		sl.add(hero2);
    //		sl.add(hero3);
    //		sl.add(hero4);
    		sl.addByOrder(hero1);
    		sl.addByOrder(hero2);
    		sl.addByOrder(hero4);
    		sl.addByOrder(hero3);
    		sl.list();
    		
    //		HeroNode hn = new HeroNode(3,"小卢","玉麒麟~~");
    //		sl.updata(hn);
    		sl.del(3);
    		sl.list();
    	}
    }
    //创建SingleLinkedList 管理我们的英雄
    class SingleLinkedList{
    	//初始化头节点,头结点不要动,不存放具体的数据
    	private HeroNode head = new HeroNode(0,"","");
    	//添加节点到单向链表
    	//当不考虑编号顺序时
    	//找到当前链表的最后节点,将最后节点的next指向新的节点
    	public void add(HeroNode heroNode) {
    		//因为Head节点不能动,因此我们需要一个辅助遍历temp
    		HeroNode temp = head;//temp为头指针,临时变量
    		//通过遍历链表,找到最后一个节点
    		//当循环结束之时,就是找到最后一个节点之日
    		while(true) {
    			if(temp.next==null) {//第一次调用add时temp.next等于null终止循环
    				break;//为null就跳出while循环
    			}
    			//如果没有找到最后,让temp往后移动,直到找到null为止
    			temp=temp.next;//存储传递进来的heroNode节点temp
    		}
    		//当退出while循环时,temp就指向链表最后
    		temp.next=heroNode;//跳出循环后,将传递进来的heroNode节点赋值给临时变量temp
    		
    	}
    	
    	//第二种方式在添加英雄时,根据排名奖英雄插入到指定位置
    	public void addByOrder(HeroNode heroNode) {
    		HeroNode temp = head;
    		boolean flag = false;
    		while(true) {
    			if(temp.next == null){//第二次添加英雄,不为null
    				break;
    			}
    			//假设一开始添加的第一个英雄宋江的编号为1,第二次添加的英雄编号为2,则1>2不成立,则执行temp = temp.next;
    			
    			if(temp.next.no>heroNode.no) {
    				break;
    			}else if(temp.next.no == heroNode.no) {
    				flag = true;
    				break;
    			}
    			//把1,宋江,及时雨,null 赋值给temp,这个时候再次执行循环,temp.next为null,
    			temp = temp.next;
    		}
    		
    		if(flag) {
    			System.out.println(heroNode.no+"号已经存在");
    		}else {
    			heroNode.next = temp.next;//当第一次添加英雄时,把null赋值给节点heroNode的属性next
    			temp.next = heroNode;//当第一次添加英雄时,把heroNode节点添加到temp类的属性next中去
    							
    		}
    		
    	}
    	
    	//修改节点的信息,根据no编号来修改
    	public void updata(HeroNode newHeroNode) {
    		//判断是否为空
    		if(head.next == null) {
    			System.out.println("链表为空");
    			return;
    		}
    		//找到要修改的节点
    		HeroNode temp = head.next;
    		boolean flag = false;
    		while(true) {
    			if(temp == null) {
    				break;
    			}
    			if(temp.no == newHeroNode.no) {
    				flag = true;
    				break;
    			}
    			System.out.println(temp.next+"测试");
    			temp = temp.next;
    		}
    		if(flag) {
    			temp.name = newHeroNode.name;
    			temp.nickname=newHeroNode.nickname;
    		}else {
    			System.out.println("没有找到该编号");
    		}
    	}
    	
    	//删除节点
    	public void del(int no) {
    		HeroNode temp = head;
    		boolean flag = false;//标志是否找要删除的节点
    		while(true) {
    			if(temp.next == null) {
    				break;
    			}
    			if(temp.next.no == no) {
    				flag = true;
    				break;
    			}			
    			System.out.println(temp.next+"测试");//宋江
    			temp = temp.next;
    			System.out.println(temp.next+"测试");//卢俊义
    		}
    		if(flag) {
    			temp.next = temp.next.next;
    		}else {
    			System.out.println("要删除的节点不存在");
    		}
    	}
    	//显示链表
    	public void list() {
    		//判断链表是否为null
    		if(head.next==null) {
    			System.out.println("链表为空");
    		}
    		//因为头节点不能动,因此需要一个辅助变量来遍历
    		HeroNode temp = head.next;
    		while(true) {
    			if(temp==null) {
    				break;
    			}
    			System.out.println(temp);
    			temp=temp.next;//指针后移
    		}
    	}
    }
    //定义HeroNode,每个HeroNode 对象就是一个节点
    class HeroNode{
    	
    	public int no;
    	public String name;
    	public String nickname;
    	public HeroNode next;//指向下一个节点
    	
    	//构造器
    	public HeroNode(int no, String name ,String nickname) {
    		this.no = no;
    		this.name = name;
    		this.nickname = nickname;
    	}
    
    	@Override
    	public String toString() {
    		return "HeroNode [no=" + no + ", name=" + name + ", nickname=" + nickname + "]";
    	}
    	
    }
    //这玩意真废脑子
    
  • 相关阅读:
    Leetcode 217 存在重复
    Leetcode 125验证回文串
    HTML标签
    Having dreams is what makes life tolerable.
    Database数据库——MySQL简述
    Python实践之路8——选课系统
    Python学习之路16——线程、进程和协程
    Python实践之路7——计算器
    Python学习之路14——Socket
    Python学习之路13——异常处理
  • 原文地址:https://www.cnblogs.com/train99999/p/11105296.html
Copyright © 2011-2022 走看看