数据结构与算法Java实现-03创建一个单链表

    科技2026-02-17  9

    day02-创建一个单链表

    package aStudy.day2; import sun.font.EAttribute; import javax.sql.rowset.CachedRowSet; import java.io.PrintWriter; import java.time.temporal.Temporal; import java.util.TreeMap; /** * @author haoqi * @Date 2020/9/26 - 13:33 * * 01.建立一个单链表 */ public class data01 { public static void main(String[] args) { //test //1创建节点 HeroNode hero1 = new HeroNode(1,"haoqi","black"); HeroNode hero2 = new HeroNode(2,"xuxuchao","shouzi"); HeroNode hero3 = new HeroNode(3,"dapeng","pangzi"); HeroNode hero4 = new HeroNode(4,"saifei","liuzi"); //2创建链表 SingleLinkedList singleLinkedList = new SingleLinkedList(); // //3加入 // singleLinkedList.add(hero1); // singleLinkedList.add(hero2); // singleLinkedList.add(hero3); // singleLinkedList.add(hero4); //按序号排列 singleLinkedList.addOrder(hero1); singleLinkedList.addOrder(hero4); singleLinkedList.addOrder(hero2); singleLinkedList.addOrder(hero3); //4显示没有修改之前的 singleLinkedList.list(); System.out.println("\n==============\n"); //测试要修改的节点 HeroNode newHeroNode = new HeroNode(2,"wuzhen","xiaohai"); singleLinkedList.update(newHeroNode); //4显示 singleLinkedList.list(); System.out.println("\n==============\n"); //删除节点 singleLinkedList.deldet(1); singleLinkedList.deldet(4); singleLinkedList.list(); } } //1.定义HeroNode,链表节点 class HeroNode{ public int no; public String name; public String niloName; public HeroNode next; //指向下一个节点 //构造器 public HeroNode(int no, String name, String niloName) { this.no = no; this.name = name; this.niloName = niloName; } //显示方法,重新toString @Override public String toString() { return "LinkList{" + "no=" + no + ", name='" + name + '\'' + ", niloName='" + niloName + '\'' + '}'; } } //2.定义singleList 管理我们的英雄 class SingleLinkedList{ //1初始化一个头节点,(不能移动,Java没有指针的概念)不存放具体数据 private HeroNode head = new HeroNode(0,"",""); //2返回头节点 public HeroNode getHead(){ return head; } //--->添加节点到单向链表,不考录编号顺序 //3找到当前链表未节点,将尾节点指向新的节点 public void add(HeroNode heroNode){ //1因为head不能动,此时需要一个辅助节点temp HeroNode temp = head; //2遍历单链表 while (true){ //找到单链表末尾 if (temp.next == null) break; //不是尾节点则后移一位 temp = temp.next; } //3while 结束表明链表到尾部了 //将尾节点的next指向新增节点 temp.next = heroNode; } //--->添加节点到单向链表,考录编号顺序 //若添加元素重复,则提示添加失败 public void addOrder(HeroNode heroNode) { //1head不能移动 //由于是单链表,temp辅助节点要位于插入位置之前 HeroNode temp = head; boolean flag = false; //flag标志添加元素是否重复,默认false while (true) { if (temp.next == null) break;//达到尾部 if (temp.next.no > heroNode.no) break;//位置找到在temp后面插入 if (temp.next.no == heroNode.no) { flag = true; break; } //插入的元素已经重复 //后移 temp = temp.next; } //判断flag值 if (flag){ //为真,不能添加,说明元素重复 System.out.printf("要添加的编号 %d 已经存在,不能加入\n",heroNode.no); } else { //进行插入操作 heroNode.next = temp.next; temp.next = heroNode; } } //3.改节点信息,根据no编号修改 //1利用newHeroNode 的 no 修改 public void update(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; } temp = temp.next; } //根据flag判断是否找到要修改的节点 if (flag){ temp.name = newHeroNode.name; temp.niloName = newHeroNode.niloName; } else System.out.printf("没有找到编号 %d 的节点,无法修改",newHeroNode.no); } //4.删除节点 //head不能移动,需要temp辅助节点 //利用temp.next.no == no 的特性,进行操作 public void deldet(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; //未找到,后移 } //判断flag if(flag){ // 找到,并删除 temp.next = temp.next.next; }else System.out.printf("delete error %d\n",no); } //4显示链表【遍历】 public void list(){ //判断链表是否为空 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; } } }
    Processed: 0.021, SQL: 9