单链表之实现(以及增删改查)
Posted nathanielsv
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单链表之实现(以及增删改查)相关的知识,希望对你有一定的参考价值。
//节点类(jdk源码中的Node) class HeroNode{ //这里方便调用,把属性定义为public,一般不允许 public int id; public String name; public String nickName; //下一节点的指针 public HeroNode next; public HeroNode(int id, String name, String nickName) { this.id = id; this.name = name; this.nickName = nickName; } @Override public String toString() { return "HeroNode{" + "id=\'" + id + \'\\\'\' + ", name=\'" + name + \'\\\'\' + ", nickName=\'" + nickName + \'\\\'\' + \'}\'; } }
上面代码为自定义的一个节点类,由上图可知单向链表的逻辑关系图
//单链表类 class SingleLinkList{ //创建链表时先初始化一个头节点,这个头节点不放任何数据,用来指名这个链表的存在 private HeroNode head = new HeroNode(0,"",""); //往单链表中添加节点 public void add(HeroNode heroNode){ //需要遍历节点,找出next==null的尾节点。 HeroNode temp = head; while(true){ if(temp.next ==null){ break; } temp = temp.next; } temp.next = heroNode; } }
以上代码仅仅为往链表中插入节点数据
//往单链表中顺序插入 public void addByOrder(HeroNode heroNode){ //需要遍历节点,找出next==null的尾节点。 HeroNode temp = head; boolean flag = false; //这是一个标记位,用来指示 while(true){//这就是一个遍历的过程 if(temp.next ==null){ //说明temp已经是链表的最后了。这段逻辑判断必须放在第一位,可以有效防止空指针 break; } if(temp.next.id>heroNode.id){ break; }else if(temp.next.id == heroNode.id){ //这里必须要用下一个节点去判断,【如果是空链表,这时会报空指针】 flag = true; break; } temp = temp.next; } if(flag){ System.out.printf("当前链表中需要加入的节点已经存在,节点id为:%d\\n",heroNode.id); }else{ heroNode.next=temp.next; //指向节点改变 temp.next = heroNode; } }
以上为节点排序插入(边插边排序)
//修改节点 public void updateNode(HeroNode newHeroNode){ if(head.next ==null){ System.out.println("链表为空"); return; } HeroNode temp = head; boolean flag = false; while(true){ if(temp.next==null){ break; } if(temp.next.id == newHeroNode.id){ flag = true; break; } temp = temp.next; } if(flag){ temp.next.name = newHeroNode.name; temp.next.nickName = newHeroNode.nickName; }else{ System.out.printf("未找到id为%d的节点\\n",newHeroNode.id); } }
以上为修改节点
//删除节点 public void delNode(int id){ if(head.next ==null){ System.out.println("链表为空"); return; } HeroNode temp = head; boolean flag = false; while(true){ if(temp.next ==null){ break; } if(temp.next.id == id){ flag = true; break; } temp= temp.next; } if(flag){ temp.next = temp.next.next; }else{ System.out.printf("未找到id为%d的节点\\n",id); } }
以上为删除节点
//遍历链表 public void showList(){ //判断链表是否为空 if(head.next ==null){ System.out.println("链表为空"); return; } HeroNode temp = head.next; while (true){ if(temp == null){ break; } System.out.println(temp); temp = temp.next; } }
以上为遍历链表
以上是关于单链表之实现(以及增删改查)的主要内容,如果未能解决你的问题,请参考以下文章