单链表的增删改查

mac2026-04-08  5

添加

单链表的添加分为两种:

无序的添加,直接在链表末端加入新的节点元素有序添加,根据序号添加到对应的节点位置 效果图如下

话不多说,代码实现一波。代码的备注写的很清楚,不懂的地方可以看备注

代码实现

无序添加,直接在链表末端加入新的节点元素 // 添加节点到单链表 // 不考虑编号的顺序时,找到当前链表的最后节点;将最后这个节点的next指向新的节点 public void add(HeroNode heroNode) { // 因为头结点不能动,因此需要一个辅助遍历temp HeroNode temp = head; // 遍历链表,找到最后 while (true) { if (temp.next == null) { break; } // 如果不是最后一个,temp后移。 temp = temp.next; } // 退出while循环时,temp只想你链表最后的节点 // 将最后一个节点的next指向新节点 temp.next = heroNode; } 有序添加,根据序号添加到对应的节点位置 // 添加时按序号排序插入指定位置,如果有则提示已存在 public void addByOrder(HeroNode heroNode) { // 因为头结点不能动,因此需要一个辅助来找到添加位置;temp是位于添加位置的前一个节点 HeroNode temp = head; boolean flag = false;// 添加的编号是否存在,默认为false while (true) { if (temp.next == null) {// 说明temp已经在链表最后 break; } if (temp.next.no > heroNode.no) {// 找到位置,就在temp的后面插入 break; } else if (temp.next.no == heroNode.no) {// 要添加的位置已经存在 flag = true; break; } temp = temp.next;// 后移遍历当前链表 } // 判断flag的值 if (flag) { System.out.printf("准备插入的英雄的编号%d已经存在,不能加入\n", heroNode.no); } else { // 插入到链表中,temp的后面 heroNode.next = temp.next; temp.next = heroNode; } } 根据编号修改信息 // 修改节点信息,根据no编号来修改,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.nickname = newHeroNode.nickname; } else {// 没有找到 System.out.printf("没有找到编号%的节点不能修改\n", newHeroNode.no); } } 删除结点 // 删除结点 // head不能动,添加temp辅助节点在,找到待删除节点的前一个节点 // 比较时,是temp.next.no和需要删除的节点no比较 public void delete(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;// temp后移,遍历 } // 判断flag if (flag) {// 找到。可以删除 temp.next = temp.next.next; } else { System.out.printf("要删除的节点%d不存在\n", no); } }

代码整合

package com.linkedlist; 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 singleLinkedList = new SingleLinkedList(); // 加入 // singleLinkedList.add(hero1); // singleLinkedList.add(hero2); // singleLinkedList.add(hero3); // singleLinkedList.add(hero4); // 加入按照编号加入 singleLinkedList.addByOrder(hero1); singleLinkedList.addByOrder(hero4); singleLinkedList.addByOrder(hero3); singleLinkedList.addByOrder(hero2); singleLinkedList.addByOrder(hero1); // 显示 singleLinkedList.list(); // 测试修改节点 HeroNode newHeroNode = new HeroNode(2, "小卢", "玉麒麟~~"); singleLinkedList.update(newHeroNode); // 显示 System.out.println("修改后的~~~"); singleLinkedList.list(); // 删除一个节点 singleLinkedList.delete(1); // singleLinkedList.delete(4); // singleLinkedList.delete(2); // singleLinkedList.delete(3); System.out.println("delete后的~~~"); singleLinkedList.list(); } } // 定义SingleLinkedList管理英雄人物 class SingleLinkedList { // 初始化头结点,头结点不要动 private HeroNode head = new HeroNode(0, "", ""); // 添加节点到单链表 // 不考虑编号的顺序时,找到当前链表的最后节点;将最后这个节点的next指向新的节点 public void add(HeroNode heroNode) { // 因为头结点不能动,因此需要一个辅助遍历temp HeroNode temp = head; // 遍历链表,找到最后 while (true) { if (temp.next == null) { break; } // 如果不是最后一个,temp后移。 temp = temp.next; } // 退出while循环时,temp只想你链表最后的节点 // 将最后一个节点的next指向新节点 temp.next = heroNode; } // 添加时按序号排序插入指定位置,如果有则提示已存在 public void addByOrder(HeroNode heroNode) { // 因为头结点不能动,因此需要一个辅助来找到添加位置;temp是位于添加位置的前一个节点 HeroNode temp = head; boolean flag = false;// 添加的编号是否存在,默认为false while (true) { if (temp.next == null) {// 说明temp已经在链表最后 break; } if (temp.next.no > heroNode.no) {// 找到位置,就在temp的后面插入 break; } else if (temp.next.no == heroNode.no) {// 要添加的位置已经存在 flag = true; break; } temp = temp.next;// 后移遍历当前链表 } // 判断flag的值 if (flag) { System.out.printf("准备插入的英雄的编号%d已经存在,不能加入\n", heroNode.no); } else { // 插入到链表中,temp的后面 heroNode.next = temp.next; temp.next = heroNode; } } // 修改节点信息,根据no编号来修改,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.nickname = newHeroNode.nickname; } else {// 没有找到 System.out.printf("没有找到编号%的节点不能修改\n", newHeroNode.no); } } // 删除结点 // head不能动,添加temp辅助节点在,找到待删除节点的前一个节点 // 比较时,是temp.next.no和需要删除的节点no比较 public void delete(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;// temp后移,遍历 } // 判断flag if (flag) {// 找到。可以删除 temp.next = temp.next.next; } else { System.out.printf("要删除的节点%d不存在\n", no); } } // 显示链表[遍历] 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 = 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; } // 为了显示方便重写toString @Override public String toString() { return "HeroNode [no=" + no + ", name=" + name + ", nickname=" + nickname + "]"; } }
最新回复(0)