• java 实现链表


    List.java

    1. package linkedList;
    2. public interface List {
    3. boolean add(E e);
    4. boolean addFirst(E e);
    5. boolean addLast(E e);
    6. boolean remove(Object o);
    7. E get(int index);
    8. void printLinkList();
    9. }

    LinkedList.java

    1. package linkedList;
    2. public class LinkedList implements List {
    3. Node first;
    4. Node last;
    5. int size;
    6. private static class Node {
    7. E item;
    8. Node next;
    9. Node prev;
    10. public Node(Node prev, E element, Node next) {
    11. this.item = element;
    12. this.next = next;
    13. this.prev = prev;
    14. }
    15. }
    16. void linkFirst(E e) {
    17. final Node f = first;
    18. final Node newNode = new Node<>(null, e, f);
    19. first = newNode;
    20. if (f == null) {
    21. last = newNode;
    22. } else {
    23. f.prev = newNode;
    24. }
    25. size++;
    26. }
    27. void linkLast(E e) {
    28. final Node l = last;
    29. final Node newNode = new Node<>(l, e, null);
    30. last = newNode;
    31. if (l == null) {
    32. first = newNode;
    33. } else {
    34. l.next = newNode;
    35. }
    36. size++;
    37. }
    38. E unlink(Node x) {
    39. final E element = x.item;
    40. final Node next = x.next;
    41. final Node prev = x.prev;
    42. if (prev == null) {
    43. first = next;
    44. } else {
    45. prev.next = next;
    46. x.prev = null;
    47. }
    48. if (next == null) {
    49. last = prev;
    50. } else {
    51. next.prev = prev;
    52. x.next = null;
    53. }
    54. x.item = null;
    55. size--;
    56. return element;
    57. }
    58. @Override
    59. public boolean add(E e) {
    60. linkLast(e);
    61. return true;
    62. }
    63. @Override
    64. public boolean addFirst(E e) {
    65. linkFirst(e);
    66. return true;
    67. }
    68. @Override
    69. public boolean addLast(E e) {
    70. linkLast(e);
    71. return true;
    72. }
    73. @Override
    74. public boolean remove(Object o) {
    75. if (o == null) {
    76. for (Node x = first; x != null; x = x.next) {
    77. if (x.item == null) {
    78. unlink(x);
    79. return true;
    80. }
    81. }
    82. } else {
    83. for (Node x = first; x != null; x = x.next) {
    84. if (o.equals(x.item)) {
    85. unlink(x);
    86. return true;
    87. }
    88. }
    89. }
    90. return false;
    91. }
    92. @Override
    93. public E get(int index) {
    94. return node(index).item;
    95. }
    96. @Override
    97. public void printLinkList() {
    98. if (this.size == 0) {
    99. System.out.println("链表为空");
    100. } else {
    101. Node temp = first;
    102. System.out.print("目前的列表,头节点:" + first.item + " 尾节点:" + last.item + " 整体:");
    103. while (temp != null) {
    104. System.out.print(temp.item + ",");
    105. temp = temp.next;
    106. }
    107. System.out.println();
    108. }
    109. }
    110. Node node(int index) {
    111. if (index < (size >> 1)) {
    112. Node x = first;
    113. for (int i = 0; i < index; i++) {
    114. x = x.next;
    115. }
    116. return x;
    117. } else {
    118. Node x = last;
    119. for (int i = size - 1; i > index; i--) {
    120. x = x.prev;
    121. }
    122. return x;
    123. }
    124. }
    125. }

    测试代码

    1. public static void main(String[] args) {
    2. var list = (List) new LinkedList();
    3. list.add("a");
    4. list.addFirst("b");
    5. list.addLast("c");
    6. list.printLinkList();
    7. list.addFirst("d");
    8. list.remove("b");
    9. list.printLinkList();
    10. }

  • 相关阅读:
    ubuntu软件源
    InnoDB中的索引
    freeRTOS学习(一)
    【React源码】(十一)fiber 树渲染
    Attention Is All You Need--论文笔记
    MySql 游标 触发器
    linux下的采用epoll网络模型的文件传输
    【Spring MVC】注册Spring MVC中的特殊组件bean
    golang开发类库推荐
    35、CSS进阶——行盒的垂直对齐以及图片底部白边
  • 原文地址:https://blog.csdn.net/fanghailiang2016/article/details/138092984