当前位置:   article > 正文

单链表的应用实例(增删改查)_单链表例子

单链表例子

        单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) + 指针(指示后继元素存储位置),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据。

带头结点的单链表和不带头结点的单链表
一、两者区别:

1、不带头结点的单链表对于第一个节点的操作与其他节点不一样,需要特殊处理,这增加了程序的复杂性和出现bug的机会,因此,通常在单链表的开始结点之前附设一个头结点。

2、带头结点的单链表,初始时一定返回的是指向头结点的地址,所以一定要用二维指针,否则将导致内存访问失败或异常。

3、带头结点与不带头结点初始化、插入、删除、输出操作都不样,在遍历输出链表数据时,带头结点的判断条件是while(head->next!=NULL),而不带头结点是while(head!=NULL),虽然头指针可以在初始时设定,但是如1所述,对于特殊情况如只有一个节点会出现问题。

 下面就是手写带头结点的单链表代码

定义存储的数据类型

这里定义一个英雄,相当于节点,节点中指向下一个节点,英雄中存在下一个英雄。

  1. class HeroNode {
  2. public int no;
  3. public String name;
  4. public String nickname;
  5. public HeroNode next;
  6. // 构造器
  7. public HeroNode(int no, String name, String nickname) {
  8. this.no = no;
  9. this.name = name;
  10. this.nickname = nickname;
  11. }
  12. @Override
  13. public String toString() {
  14. return "HeroNode [no=" + no + ", name=" + name + ", nickname=" + nickname + "]";
  15. }
  16. }

然后手写链表的实现

首先是添加方法  尾部添加和有序添加

  1. // 定义一个SingleLinkedList管理英雄人物
  2. class SingleLinkedList {
  3. // 先初始化一个头结点 头结点不要动
  4. private HeroNode head = new HeroNode(0, "", "");
  5. // 添加方法 添加到链表的最后
  6. // 不考虑编号的顺序时,找到当前链表中下一个next为null的英雄则为最后一个英雄
  7. // 将最后英雄的next指向新节点
  8. public void add(HeroNode heroNode) {
  9. // head节点不能动,因此我们需要一个辅助变量
  10. // temp相当于指针,遍历每个变量
  11. HeroNode temp = head;
  12. while (true) {
  13. // 什么时候说明链表到最后了就结束
  14. if (temp.next == null) {
  15. break;
  16. }
  17. // 如果不是最后一个就后移
  18. temp = temp.next;
  19. } // 只有temp指向最后一个的时候 才会退出循环
  20. // 让最后一个元素的下一个指向新添加的元素结束
  21. temp.next = heroNode;
  22. }
  23. // 第二种方式添加 根据序号添加
  24. // 如果排名存在则显示添加失败,并给出提示
  25. public void addByOrder(HeroNode heroNode) {
  26. // head节点不能动,因此我们需要一个辅助变量
  27. // 因为单链表 因此我们找的temp是添加位置的前一个节点 否则插入不了
  28. HeroNode temp = head;
  29. boolean flag = false;
  30. // 标志添加的节点编号是否存在,默认为false
  31. // break会跳出循环
  32. while (true) {
  33. if (temp.next == null) {
  34. // 说明temp已经在链表的最后
  35. break;
  36. }
  37. // 下一个节点的序号是否比需要添加的节点大
  38. if (temp.next.no > heroNode.no) {
  39. break;
  40. } else if (temp.next.no == heroNode.no) {
  41. flag = true;// 说明编号存在
  42. break;
  43. }
  44. // 往后找出当前节点的下一个节点比需要添加的节点大的节点
  45. temp = temp.next;
  46. }
  47. // 判断flag的值 如果为true 证明编号存在了
  48. if (flag) {
  49. System.out.println("编号存在,不能加入");
  50. } else {
  51. heroNode.next = temp.next;
  52. temp.next = heroNode;
  53. }
  54. }

循环遍历链表的方法

  1. // 显示链表[遍历]
  2. public void list() {
  3. // 通过辅助变量 遍历链表
  4. HeroNode temp = head;
  5. while (true) {
  6. // 头结点不能动 辅助变量来遍历
  7. // 判断链表到最后结束
  8. if (temp.next == null) {
  9. break;
  10. }
  11. System.out.println(temp.next);
  12. temp = temp.next;
  13. }
  14. }

修改链表中数据的方法

  1. // 根据heroNode的no节点来修改
  2. public void update(HeroNode heroNode) {
  3. // 判断链表是否是空的
  4. if (head.next == null) {
  5. System.out.println("链表是空的");
  6. return;
  7. }
  8. // 找到需要修改的节点,根据no找
  9. // 定义辅助变量查找
  10. HeroNode temp = head;
  11. boolean flag = false;
  12. while (true) {
  13. if (temp.no == heroNode.no) {
  14. //找到了
  15. flag = true;
  16. break;
  17. }
  18. if (temp.next == null) {
  19. // 链表遍历结束
  20. break;
  21. }
  22. temp = temp.next;
  23. }
  24. //找到了就修改
  25. if(flag) {
  26. temp.name=heroNode.name;
  27. temp.nickname=heroNode.nickname;
  28. }else {
  29. //flag仍然等于false 表示没有找到这个节点
  30. System.out.println("没有找到编号等于这个的节点"+heroNode.no);
  31. }
  32. }

删除链表中数据的方法

  1. //删除节点 找到需要删除的节点的前一个节点
  2. //被删除的节点没有任何引用 会被垃圾回收机制回收
  3. public void delete(int no) {
  4. // 通过辅助变量 遍历链表
  5. HeroNode temp = head;
  6. //是否找到需要删除的
  7. boolean flag = false;
  8. while(true){
  9. if (temp.next==null) {
  10. break;
  11. }
  12. if(temp.next.no==no) {
  13. //找到了待删除节点的前一个节点
  14. flag = true;
  15. break;
  16. }
  17. temp=temp.next;
  18. }
  19. if(flag) {
  20. //找到了可以删除
  21. temp.next=temp.next.next;
  22. }else {
  23. System.out.println("没有找到待删除的节点");
  24. }
  25. }
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/426604
推荐阅读
相关标签
  

闽ICP备14008679号