单链表

特点

  • 单链表是一种有序的数据结构
  • 除头结点外每个节点都有前驱节点
  • 除尾节点外每个节点都有后继节点
  • 头结点的数据域为空的话就是一个空链表
  • 如果要查找某个元素则只能从头顺序查找

    代码实现

    ```java import javax.sound.midi.Soundbank; import java.sql.SQLOutput;

/**

  • @author laoduan
  • @create 2020-04-08-16:22 */ public class SingleLinkedListDemo { public static void main(String[] args) {
  1. HeroNode hero1 = new HeroNode(1, "贾克斯", "武器大师");
  2. HeroNode hero2 = new HeroNode(2, "李青", "盲僧");
  3. HeroNode hero3 = new HeroNode(3, "凯瑟琳", "皮城女警");
  4. HeroNode hero4 = new HeroNode(4, "提莫", "迅捷斥候");
  5. SingleLinkedList singleLinkedList = new SingleLinkedList();

// singleLinkedList.add(hero1); // singleLinkedList.add(hero4); // singleLinkedList.add(hero2); // singleLinkedList.add(hero3); singleLinkedList.orderadd(hero1); singleLinkedList.orderadd(hero4); singleLinkedList.orderadd(hero2); singleLinkedList.orderadd(hero3); // // singleLinkedList.list(); // System.out.println(); // System.out.println(); // System.out.println(); // // HeroNode hero22 = new HeroNode(2, “瞎子”, “4396”); // singleLinkedList.update(hero22); // singleLinkedList.list();

  1. System.out.println("----------------倒序后的链表----------------");
  2. singleLinkedList.reverse(singleLinkedList.getHead());
  3. singleLinkedList.list();

// // // singleLinkedList.dele(hero3); // singleLinkedList.dele(hero2); // singleLinkedList.dele(hero1); // singleLinkedList.dele(hero4); // System.out.println(“删除后的链表”); // singleLinkedList.list();

  1. //System.out.println("倒数第k个结点");

// singleLinkedList.list(); // singleLinkedList.count(singleLinkedList.getHead()); // singleLinkedList.revek(singleLinkedList.getlength(singleLinkedList.getHead()),2);

  1. }

}

//定义singlelinkedList管理英雄 class SingleLinkedList{ private HeroNode head = new HeroNode(0,””,””);

  1. public HeroNode getHead() {
  2. return head;
  3. }
  4. //添加
  5. public void add(HeroNode heroNode){
  6. HeroNode temp = head;
  7. //遍历链表,找到最后
  8. while (true){
  9. if(temp.next==null){
  10. break;
  11. }else {
  12. //如果没有找到,就后移
  13. temp=temp.next;
  14. }
  15. }
  16. temp.next=heroNode;
  17. }
  18. //顺序添加
  19. public void orderadd(HeroNode heroNode){
  20. HeroNode temp=head;
  21. boolean flag=false;
  22. while (true){
  23. if (temp.next==null){
  24. break;
  25. }if(temp.next.no>heroNode.no){//找到要添加的位置了
  26. break;
  27. }else if(heroNode.no==temp.next.no){
  28. flag=true;
  29. System.out.println("要插入的元素已经存在");
  30. break;
  31. }
  32. temp=temp.next;
  33. }
  34. if(flag){
  35. System.out.printf("待插入的英雄 %d 已经存在,不能添加\n",heroNode.no);
  36. }else{
  37. heroNode.next=temp.next;
  38. temp.next=heroNode;
  39. }
  40. }
  41. //修改
  42. public void update(HeroNode heroNode){
  43. if (head.next==null){
  44. System.out.println("链表为空");
  45. }
  46. HeroNode temp = head;
  47. boolean flag = false;
  48. while (true){
  49. if(temp.next.no==heroNode.no){
  50. flag=true;
  51. break;
  52. }if(temp.next==null){
  53. System.out.println("链表中没有你要找的结点");
  54. break;
  55. }
  56. temp=temp.next;
  57. }
  58. if(flag){
  59. temp.next.nickname=heroNode.nickname;
  60. temp.next.name=heroNode.name;
  61. }
  62. }
  63. //删除
  64. public void dele(HeroNode heroNode){
  65. if(head==null){
  66. System.out.println("链表为空");
  67. }
  68. HeroNode temp = head;
  69. while (true){
  70. if(temp==null){
  71. System.out.println("链表中没有你要删的结点");
  72. break;
  73. }if(temp.next.no==heroNode.no){
  74. temp.next=temp.next.next;
  75. break;
  76. }
  77. temp=temp.next;
  78. }
  79. }
  80. //求单链表结点个数
  81. public int count(HeroNode head){
  82. HeroNode temp = head.next;
  83. int count=0;
  84. if(head==null){
  85. System.out.println("链表长度为0");
  86. }
  87. while (true){
  88. if(temp==null){
  89. System.out.printf("链表的长度为%d",count);
  90. break;
  91. }
  92. count++;
  93. temp=temp.next;
  94. }
  95. return count;
  96. }
  97. //翻转单链表
  98. public void reverse(HeroNode head){
  99. if(head==null){
  100. System.out.println("链表为空");
  101. }
  102. HeroNode temp = head.next;
  103. HeroNode next = null;
  104. HeroNode reversehead = new HeroNode(0,"","");
  105. while (temp!=null){
  106. next=temp.next;
  107. temp.next=reversehead.next;
  108. reversehead.next=temp;
  109. temp=next;
  110. }
  111. head.next=reversehead.next;
  112. }
  113. //获取长度
  114. public int getlength(HeroNode head){
  115. int count=0;
  116. if(head.next==null){
  117. System.out.println("链表为空");
  118. }
  119. HeroNode temp = head;
  120. while (true) {
  121. if (temp.next == null) {
  122. break;
  123. }
  124. temp = temp.next;
  125. count += 1;
  126. }
  127. return count;
  128. }
  129. //倒数第k个结点
  130. public void revek(int length,int k){
  131. HeroNode temp =head;
  132. for(int l=0;l<=length-k;l++){
  133. temp=temp.next;
  134. }
  135. System.out.printf("倒数第%d个结点是"+temp,k);
  136. }
  137. //显示
  138. public void list(){
  139. if(head.next==null){
  140. System.out.println("链表为空");
  141. return;
  142. }
  143. //头结点不能动,创建一个temp
  144. HeroNode temp=head.next;
  145. while (true){
  146. if(temp==null){
  147. break;
  148. }
  149. System.out.println(temp);
  150. //将temp后移
  151. temp=temp.next;
  152. }
  153. }

}

class HeroNode{ public int no; public String name; public String nickname; public HeroNode next;

  1. //构造器
  2. public HeroNode(int hNo,String hName,String hNickname){
  3. this.no=hNo;
  4. this.name=hName;
  5. this.nickname=hNickname;
  6. }
  7. //重写toString
  8. @Override
  9. public String toString() {
  10. return "HeroNode{" +
  11. "no=" + no +
  12. ", name='" + name + '\'' +
  13. ", nickname='" + nickname + '\'' +
  14. '}';
  15. }

} ```