分为双向链表和单向链表

单向链表

分为带头结点和不带头结点的

带头结点的单向链表注意事项

1)元素的地址并非连续
2)没有被引用的节点会被垃圾回收
3)最后一个节点的下一个节点指向空
4)即便链表为空,也会初始化一个头结点

  1. //带头结点的单向链表代码实现
  2. public class SingleLinkedListDemo {
  3. public static void main(String[] args) {
  4. SingleLinkedList.HeroNode node1 = new SingleLinkedList.HeroNode(1,"曹操1","到1");
  5. SingleLinkedList.HeroNode node2 = new SingleLinkedList.HeroNode(2,"曹操2","到2");
  6. SingleLinkedList.HeroNode node3 = new SingleLinkedList.HeroNode(3,"曹操3","到3");
  7. SingleLinkedList.HeroNode node4 = new SingleLinkedList.HeroNode(4,"曹操4","到4");
  8. SingleLinkedList.HeroNode node5 = new SingleLinkedList.HeroNode(5,"曹操5","到5");
  9. SingleLinkedList.HeroNode newNode = new SingleLinkedList.HeroNode(4,"曹操666","到666");
  10. SingleLinkedList list = new SingleLinkedList();
  11. list.add(node1);
  12. list.add(node2);
  13. list.add(node3);
  14. list.add(node4);
  15. // list.addByOrder(node1);
  16. list.set(newNode);
  17. list.remove(366);
  18. System.out.println(list);
  19. }
  20. }
  21. class SingleLinkedList{
  22. private HeroNode head = new HeroNode(0,"","");
  23. //添加元素/节点
  24. public void add(HeroNode heroNode){
  25. HeroNode temp = head;
  26. while (true){
  27. //当下一个节点为空表示该节点为最后一个节点
  28. if(temp.next == null){
  29. break;
  30. }
  31. //将当前节点指向下一个节点
  32. temp = temp.next;
  33. }
  34. //最后一个节点的下一个节点为要添加的元素
  35. temp.next = heroNode;
  36. }
  37. //根据编号顺序进行添加,如果编号已存在,则显示已存在
  38. public void addByOrder(HeroNode heroNode){
  39. HeroNode temp = head;
  40. while(true){
  41. if(temp.next == null){
  42. break;
  43. }else if(temp.next.no>heroNode.no) {
  44. break;
  45. }else if (temp.next.no == heroNode.no){
  46. System.out.println("addByOrder()编号已存在");
  47. return;
  48. }
  49. temp = temp.next;
  50. }
  51. heroNode.next = temp.next;
  52. temp.next = heroNode;
  53. }
  54. //更新节点
  55. public void set(HeroNode newNode){
  56. HeroNode temp = head;
  57. while(true){
  58. temp = temp.next;
  59. if (temp == null){
  60. System.out.println("set()未找到该节点");
  61. return;
  62. }
  63. if (temp.no == newNode.no){
  64. temp.name = newNode.name;
  65. temp.nickname = newNode.nickname;
  66. return;
  67. }
  68. }
  69. }
  70. //删除节点
  71. public void remove(int no){
  72. HeroNode temp = head;
  73. while (true){
  74. if (temp.next == null){
  75. System.out.println("remove()未找到该编号");
  76. return;
  77. }
  78. if (temp.next.no == no){
  79. temp.next = temp.next.next;
  80. return;
  81. }
  82. temp = temp.next;
  83. }
  84. }
  85. //显示列表内容(遍历)
  86. public String toString(){
  87. if (head.next == null){
  88. return "toString()链表为空";
  89. }
  90. HeroNode temp = head.next;
  91. while (true){
  92. if (temp == null){
  93. break;
  94. }
  95. System.out.println(temp);
  96. temp = temp.next;
  97. }
  98. return "";
  99. }
  100. //定义节点
  101. static class HeroNode{
  102. int no;
  103. String name;
  104. String nickname;
  105. HeroNode next;
  106. public HeroNode(int no,String name,String nickname){
  107. this.no = no;
  108. this.name = name;
  109. this.nickname = nickname;
  110. }
  111. @Override
  112. public String toString() {
  113. return "HeroNode{" +
  114. "no=" + no +
  115. ", name='" + name + '\'' +
  116. ", nickname='" + nickname + '\'' +
  117. '}';
  118. }
  119. }
  120. }