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 + "]";
    	}
    	
    }
    //这玩意真废脑子
    
  • 相关阅读:
    evernote100个做笔记的好方法
    平衡二叉树的调整模版
    晨间日记的奇迹
    hdu 2952 Counting Sheep
    hdu 1535 Invitation Cards
    poj 3259 Wormholes(spfa)
    poj 2263 Heavy Cargo(floyd)
    poj 3268 Silver Cow Party(SPFA)
    hdu 1690 Bus System
    hdu 3631 Shortest Path(Floyd)
  • 原文地址:https://www.cnblogs.com/train99999/p/11105296.html
Copyright © 2011-2022 走看看