• 数据结构:单链表


    用(带头节点)单链表完成图书统计。节点结构包括书籍编号,书籍名以及对应作者。功能包括增加(尾插法和指定位置插入法)、删除、修改、查看。


    一、定义节点结构

    每一个节点都包括这些变量,构造器复杂将传入的数据赋值给类本身的变量。

    1. public static class BookNode{
    2. public int bookNumber;
    3. public String bookName;
    4. public String bookAuthor;
    5. public BookNode next;
    6. //构造器
    7. public BookNode(int no, String book, String author){
    8. bookNumber = no;
    9. bookName = book;
    10. bookAuthor = author;
    11. }
    12. }

    二、定义一个SingleLinkList类

    该类用于管理链表,因为使用的是带头节点的单链表,因此在定义类的时候就应该把头节点定义好并初始化。

    1. public static class SingleLinkList{
    2. private BookNode head = new BookNode(0," "," ");
    3. //......
    4. }

    三、添加元素

    (1)尾插法

    入参为一个新建的节点,用temp找到temp.next为null,以为着已经到达了链表尾部。将新节点node赋值给temp.next即已经将新节点连接上链表尾部。

    1. //尾插法
    2. public void add1(BookNode node){
    3. BookNode temp = head;
    4. while(true){
    5. if(temp.next == null){
    6. break;
    7. }
    8. temp = temp.next;
    9. }
    10. temp.next = node;
    11. }

    测试结果:

     因为手动添加的顺序是1-3-2,用尾插法会默认将新节点放在尾部,所以最后输出的时候仍然保持着1-3-2的顺序。

    (2)指定位置插入

    制定位置插入是根据书本的编号来安排每个节点之间的关系。

    何为合适的位置?就是在链表中找到某一个位置,上一个节点的书本编号小于新节点的书本编号,而下一个节点的书本编号又大于新节点的书本编号,这意味着该位置就是新节点的最佳位置。前一个节点就是为temp,而后一个节点就为temp2。若满足条件,则需要断开此处的聊表链接,将新节点插入,再完成链接。

    如果寻至尾部,仍未找到满足条件的位置,则在链表最后插入即可。

    1. //中间插入
    2. public void add2(BookNode node) {
    3. BookNode temp = head;
    4. while (true) {
    5. if (temp.next == null) {
    6. temp.next = node;
    7. break;
    8. }
    9. if (node.bookNumber > temp.bookNumber) {
    10. BookNode temp2 = temp.next;
    11. if (node.bookNumber < temp2.bookNumber) {
    12. BookNode temp3 = temp.next;
    13. temp.next = node;
    14. node.next = temp3;
    15. break;
    16. }
    17. }
    18. temp = temp.next;
    19. }
    20. }

    测试结果:

     手动添加的顺序仍然是1-3-2,用制定位置插入法会按照图书标号将新节点放在编号所对应的位置,所以最后输出的顺序为1-2-3。

     

    三、展示链表

    首先判断链表是否为空,若为空则提示用户并直接return就可以了;若不为空,则用show遍历链表,并将链表中的数据打印出来即可。

    1. //展示链表
    2. public void list(){
    3. if(head.next == null){
    4. System.out.println("链表为空~没东西可看了......");
    5. return;
    6. }
    7. BookNode show = head.next;
    8. while(show != null){
    9. System.out.println("(" +show.bookNumber+ ")" +"《"+show.bookName+"》"+"作者:"+show.bookAuthor);
    10. show = show.next;
    11. }
    12. }

    四、修改链表

    传入一个新的节点,新节点的bookNumber应该与目标节点保持一致。通过对比新节点和目标节点号,寻找要修改的节点。用flag记录是否找到,如找到则将flag设为true,否则false。完成遍历后,根据flag值进行下一步操作。若为true,则意味着在链表中找到了目标节点,把链表中目标节点的数据更新为新节点的数据;若为false,意味着没有找到,则提示用户。

    1. //修改
    2. public void updata(BookNode bookdata){
    3. BookNode temp = head;
    4. boolean flag = false;
    5. while(true){
    6. if(temp.bookNumber == bookdata.bookNumber){
    7. flag = true;
    8. break;
    9. }
    10. temp = temp.next;
    11. }
    12. if(flag){
    13. temp.bookName = bookdata.bookName;
    14. temp.bookAuthor = bookdata.bookAuthor;
    15. }else{
    16. System.out.println("没有找到该元素~");
    17. }
    18. }

    测试结果:

    根据新节点的信息修改链表中节点的信息。将第二本图书,更改为无名氏写的《十万个为什么》,但序号不变。

     

    五、删除节点

    传入一个需要删除的编号,通过对比每个节点的bookNumber进行删除操作,同样用flag记录找寻结果。当找到需要删除的节点时,temp会指向需要删除的节点,而front则会指向需要删除节点的前一个节点。front变量的存在,就是为了方便删除操作,将front.next的值直接更改为temp.next值(意味着已经跳过temp节点),在java中temp节点则被视为弃用的节点会被自动回收。如果没有找到需要删除的节点,则提示用户。

    1. //删除
    2. public void del(int n){
    3. BookNode front = head;
    4. BookNode temp = head.next;
    5. Boolean flag = false;
    6. while (true){
    7. if(n == temp.bookNumber){
    8. flag = true;
    9. break;
    10. }
    11. temp = temp.next;
    12. front = front.next;
    13. }
    14. if(true){
    15. front.next = temp.next;
    16. }else{
    17. System.out.println("没有找到需要删除的数据......");
    18. }
    19. }

    测试结果:

    将第一本书鲁迅的《狂人日记》从链表中删除。最后输出仅剩两本书了。

     


    全部代码:

    1. import org.omg.Messaging.SyncScopeHelper;
    2. public class LineList {
    3. public static void main(String[] args){
    4. //书籍数据
    5. BookNode test = new BookNode(1,"狂人日记","鲁迅");
    6. BookNode test2 = new BookNode(2,"社会性动物","E.阿伦森");
    7. BookNode test3 = new BookNode(3,"时间简史","史蒂芬.霍金");
    8. //创建一个单链表
    9. SingleLinkList testlist = new SingleLinkList();
    10. //添加
    11. //头插法
    12. // testlist.add1(test);
    13. // testlist.add1(test3);
    14. // testlist.add1(test2);
    15. // //指定位置插入
    16. testlist.add2(test);
    17. testlist.add2(test3);
    18. testlist.add2(test2);
    19. // //删除
    20. testlist.del(1);
    21. //
    22. // //修改
    23. BookNode updata = new BookNode(2,"十万个为什么","无名氏");
    24. testlist.updata(updata);
    25. //展示链表
    26. testlist.list();
    27. }
    28. //节点
    29. public static class BookNode{
    30. public int bookNumber;
    31. public String bookName;
    32. public String bookAuthor;
    33. public BookNode next;
    34. //构造器
    35. public BookNode(int no, String book, String author){
    36. bookNumber = no;
    37. bookName = book;
    38. bookAuthor = author;
    39. }
    40. }
    41. //管理
    42. public static class SingleLinkList{
    43. private BookNode head = new BookNode(0," "," ");
    44. //尾插法
    45. public void add1(BookNode node){
    46. BookNode temp = head;
    47. while(true){
    48. if(temp.next == null){
    49. break;
    50. }
    51. temp = temp.next;
    52. }
    53. temp.next = node;
    54. }
    55. //中间插入
    56. public void add2(BookNode node) {
    57. BookNode temp = head;
    58. while (true) {
    59. if (temp.next == null) {
    60. temp.next = node;
    61. break;
    62. }
    63. if (node.bookNumber > temp.bookNumber) {
    64. BookNode temp2 = temp.next;
    65. if (node.bookNumber < temp2.bookNumber) {
    66. BookNode temp3 = temp.next;
    67. temp.next = node;
    68. node.next = temp3;
    69. break;
    70. }
    71. }
    72. temp = temp.next;
    73. }
    74. }
    75. //展示链表
    76. public void list(){
    77. if(head.next == null){
    78. System.out.println("链表为空~没东西可看了......");
    79. return;
    80. }
    81. BookNode show = head.next;
    82. while(show != null){
    83. System.out.println("(" +show.bookNumber+ ")" +"《"+show.bookName+"》"+"作者:"+show.bookAuthor);
    84. show = show.next;
    85. }
    86. }
    87. //修改
    88. public void updata(BookNode bookdata){
    89. BookNode temp = head;
    90. boolean flag = false;
    91. while(true){
    92. if(temp.bookNumber == bookdata.bookNumber){
    93. flag = true;
    94. break;
    95. }
    96. temp = temp.next;
    97. }
    98. if(flag){
    99. temp.bookName = bookdata.bookName;
    100. temp.bookAuthor = bookdata.bookAuthor;
    101. }else{
    102. System.out.println("没有找到该元素~");
    103. }
    104. }
    105. //删除
    106. public void del(int n){
    107. BookNode front = head;
    108. BookNode temp = head.next;
    109. Boolean flag = false;
    110. while (true){
    111. if(n == temp.bookNumber){
    112. flag = true;
    113. break;
    114. }
    115. temp = temp.next;
    116. front = front.next;
    117. }
    118. if(true){
    119. front.next = temp.next;
    120. }else{
    121. System.out.println("没有找到需要删除的数据......");
    122. }
    123. }
    124. }
    125. }

  • 相关阅读:
    计算机视觉发展和应用浅谈
    IAR重大升级,支持VS Code,ST发布第一个带有处理单元的传感器
    XSS进阶三
    C选择结构程序设计
    php编程入门先学什么 PHP程序员需要具备哪些技能
    SI24R2F+畜牧业养殖方案
    mac IDEA激活 亲测有效
    【Linux】【网络】工具:httplib 库的安装与简单使用
    docker部署gitlab内存占用过大的解决
    ip的标准分类---分类的Ip
  • 原文地址:https://blog.csdn.net/Hokachi/article/details/127927943