从单链表中删除一个节点的思路: 1.咱们先要找到,要删除的这个节点的前一个节点的temp。 2. temp.next=temp.next.next 3. 被删除的节点,将不会有其余任何指向,会被垃圾回收机制回收
//定义一个HerNode,每一个HerNode对象就是一个节点 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; } //重写toStrong方法 @Override public String toString() { return "HerNode{" + "no=" + no + ", name='" + name + '\'' + ", nickname='" + nickname + '\'' + '}'; } }
删除实现代码java
class SingleLinkedList{ // 先初始化一个头节点,头节点不要动,不存放具体的数据 private HeroNode head =new HeroNode(0,"",""); // 删除节点 // 思路 // 1.head节点不能动,所以咱们须要一个temp辅助节点来找到要删除节点的前一个节点 // 22. 说明咱们在比较是,是temp.next.no和须要删除的节点的no比较 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; } temp=temp.next; } if (flag){ temp.next=temp.next.next; }else { System.out.printf("删除失败,编号为%d的节点不存在\n",no); } } }
测试代码:web
//删除 public class SingleLinkedListDemo { public static void main(String[] args) { HeroNode heroNode1 = new HeroNode(1, "宋江", "及时雨"); HeroNode heroNode2 = new HeroNode(2, "卢俊义", "玉麒麟"); HeroNode heroNode3 = new HeroNode(3, "吴用", "智多星"); HeroNode heroNode4 = new HeroNode(4, "林冲", "豹子头"); //显示 singleLinkedList.list(); //删除 singleLinkedList.del(1); singleLinkedList.del(3); System.out.println("删除以后的结果..."); singleLinkedList.list(); }
修改实现代码数据结构
class SingleLinkedList{ // 先初始化一个头节点,头节点不要动,不存放具体的数据 private HeroNode head =new HeroNode(0,"",""); // 修改节点信息,根据no编号来修改,即no编号不能改 // 说明 // 1.根据newHero的no来修改 public void update (HeroNode newHeroNode){ // 判断是否为空 if(head.next==null){ System.out.println("链表为空~"); return; } // z找到须要修改的节点 根据no // 定义一个辅助变量 HeroNode 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编号,不存在\n",newHeroNode.no ); } } }
测试代码:ide
public class SingleLinkedListDemo { public static void main(String[] args) { HeroNode heroNode1 = new HeroNode(1, "宋江", "及时雨"); HeroNode heroNode2 = new HeroNode(2, "卢俊义", "玉麒麟"); HeroNode heroNode3 = new HeroNode(3, "吴用", "智多星"); HeroNode heroNode4 = new HeroNode(4, "林冲", "豹子头"); HeroNode heroNode5 = new HeroNode(4, "小范", "豹子头~"); //显示 singleLinkedList.list(); //修改 singleLinkedList.update(heroNode5); System.out.println("修改以后的结果..."); singleLinkedList.list(); }
package com.atg.linkedlist; public class SingleLinkedListDemo { public static void main(String[] args) { // 测试 // 先建立节点 HeroNode heroNode1 = new HeroNode(1, "宋江", "及时雨"); HeroNode heroNode2 = new HeroNode(2, "卢俊义", "玉麒麟"); HeroNode heroNode3 = new HeroNode(3, "吴用", "智多星"); HeroNode heroNode4 = new HeroNode(4, "林冲", "豹子头"); HeroNode heroNode5 = new HeroNode(4, "小范", "豹子头~"); // 建立一个链表 // 加入 SingleLinkedList singleLinkedList = new SingleLinkedList(); // singleLinkedList.add(heroNode4); // singleLinkedList.add(heroNode1); // singleLinkedList.add(heroNode2); // singleLinkedList.add(heroNode3); System.out.println("链表展现详情..."); singleLinkedList.addByOrder(heroNode1); singleLinkedList.addByOrder(heroNode2); singleLinkedList.addByOrder(heroNode3); singleLinkedList.addByOrder(heroNode4); //显示 singleLinkedList.list(); System.out.println("修改以后的结果..."); singleLinkedList.update(heroNode5); singleLinkedList.list(); //删除 singleLinkedList.del(1); singleLinkedList.del(3); System.out.println("修改以后的结果..."); singleLinkedList.list(); } } //定义SingleLinkedList,管理咱们的英雄 class SingleLinkedList{ // 先初始化一个头节点,头节点不要动,不存放具体的数据 private HeroNode head =new HeroNode(0,"",""); // 添加节点到单向链表 // 思路不考虑编号顺序 // 1.找到当前链表的最后节点 // 2.将最后节点的next指向新的节点 public void add(HeroNode heroNode){ // 由于head节点不能动所以咱们须要借助temp来辅助遍历 HeroNode temp=head; // 遍历链表找到最后 while (true){ // 找到最后 if(temp.next==null){ break; } // 若是没有找到最后将temp后移 temp=temp.next; } // 当退出while循环是,temp就指向了链表的最后 // 将最后这个节点的next,指向新的节点 temp.next=heroNode; } // 显示链表[遍历] public void list(){ // 判断链表是否为空 if(head.next==null){ System.out.println("链表为空"); return; } // 由于head节点不能动所以咱们须要借助temp来辅助遍历, // 由经if语句可得执行此处链表一定有一个数 ,故 HeroNode temp=head.next; HeroNode temp=head.next; // 遍历链表找到最后 while (true){ // 找到最后 if(temp==null){ break; } // 输出节点信息 System.out.println(temp); // 若是没有找到最后将temp后移 temp=temp.next; // } } // 第二种方式添加英雄时,根据排名插入到指定的位置 // 若是有这个排名,则添加失败并给出提示 public void addByOrder(HeroNode heroNode){ // 由于头部节点不能动,所以咱们须要经过一个辅助的指针(变量)来帮助咱们添加的位置 // 由于单链表,由于的咱们的temp是位于添加位置的前一个节点,不然插入不了 HeroNode temp=head; boolean flag=false;//flag 标志添加的编号是否存在,默认为false while (true){ if (temp.next==null){ // 说明temp已经在链表的最后 break; } if (temp.next.no>heroNode.no){ // 位置找到,就在temp的后面插入 break; } else if (temp.next.no==heroNode.no){ // 说明heroNode的编号已经存在 flag = true; break; } // 后移遍历链表 temp=temp.next; } // 判断flag if (flag){ // 不能添加 heroNode的编号已经存在 System.out.printf("排名%d的英雄已存在,插入失败\n",heroNode.no); }else { // 插入到链表中,temp的后面 heroNode.next=temp.next; temp.next=heroNode; } } // 修改节点信息,根据no编号来修改,即no编号不能改 // 说明 // 1.根据newHero的no来修改 public void update (HeroNode newHeroNode){ // 判断是否为空 if(head.next==null){ System.out.println("链表为空~"); return; } // z找到须要修改的节点 根据no // 定义一个辅助变量 HeroNode 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编号,不存在\n",newHeroNode.no ); } } // 删除节点 // 思路 // 1.head节点不能动,所以咱们须要一个temp辅助节点来找到要删除节点的前一个节点 // 22. 说明咱们在比较是,是temp.next.no和须要删除的节点的no比较 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; } temp=temp.next; } if (flag){ temp.next=temp.next.next; }else { System.out.printf("删除失败,编号为%d的节点不存在\n",no); } } } //定义一个HerNode,每一个HerNode对象就是一个节点 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; } //重写toStrong方法 @Override public String toString() { return "HerNode{" + "no=" + no + ", name='" + name + '\'' + ", nickname='" + nickname + '\'' + '}'; } }