链表LinkedList实现栈(Java)

╰半橙微兮° 2023-07-01 08:42 266阅读 0赞

链表LinkedList实现栈

LinkedList.java(链表)详细请看链表LinkedList(Java)

  1. public class LinkedList<E> {
  2. private class Node {
  3. // 内部类将节点设为私有 隐藏实现细节
  4. public E e;// 元素
  5. public Node next;// next指针
  6. public Node(E e, Node next) {
  7. this.e = e;
  8. this.next = next;
  9. }
  10. public Node(E e) {
  11. this(e, null);
  12. }
  13. public Node() {
  14. this(null, null);
  15. }
  16. @Override
  17. public String toString() {
  18. return e.toString();
  19. }
  20. }
  21. private Node dummyhead; // 设置虚拟头节点
  22. int size;// 链表中元素个数
  23. public LinkedList() {
  24. // TODO Auto-generated constructor stub
  25. dummyhead = new Node(null, null);
  26. size = 0;
  27. }
  28. // 获取链表中的元素个数
  29. public int getSize() {
  30. return size;
  31. }
  32. // 返回链表是否为空
  33. public boolean isEmpty() {
  34. // TODO Auto-generated method stub
  35. return size == 0;
  36. }
  37. // 在链表的index位置添加一个元素
  38. public void add(int index, E e) {
  39. if (index < 0 || index > size) {
  40. try {
  41. throw new Exception("index越界");
  42. } catch (Exception e1) {
  43. // TODO Auto-generated catch block
  44. e1.printStackTrace();
  45. }
  46. }
  47. Node prev = dummyhead;// 创建一个索引与dummyhead指向一致
  48. for (int i = 0; i < index; i++) // 需要找到索引的前一个位置
  49. prev = prev.next;// prev在链表中移动
  50. // Node node = new Node(e);//创建一个node
  51. // node.next = prev.next;//node.next指向prev.next
  52. // prev.next = node;//prev.next指向node
  53. prev.next = new Node(e, prev.next);// 等于 上面3行代码
  54. size++;
  55. }
  56. // 在链表尾部添加元素
  57. public void addLast(E e) {
  58. add(size, e);
  59. }
  60. // 在链表头添加元素
  61. public void addFirst(E e) {
  62. // TODO Auto-generated method stub
  63. add(0, e);
  64. }
  65. // 获得链表的第index个元素
  66. public E get(int index) {
  67. if (index < 0 || index > size) {
  68. try {
  69. throw new Exception("index越界");
  70. } catch (Exception e1) {
  71. // TODO Auto-generated catch block
  72. e1.printStackTrace();
  73. }
  74. }
  75. Node cur = dummyhead.next;// 寻找第index个元素
  76. for (int i = 0; i < index; i++)
  77. cur = cur.next;
  78. return cur.e;// 返回cur.e就是第index个元素
  79. }
  80. // 获得第一个元素
  81. public E getFirst() {
  82. return get(0);
  83. }
  84. // 获得最后一个元素
  85. public E getLast() {
  86. return get(size - 1);
  87. }
  88. // 修改链表的第index个元素
  89. public void set(int index, E e) {
  90. if (index < 0 || index >= size) {
  91. try {
  92. throw new Exception("index越界");
  93. } catch (Exception e1) {
  94. // TODO Auto-generated catch block
  95. e1.printStackTrace();
  96. }
  97. }
  98. Node cur = dummyhead.next;// 寻找第index个元素
  99. for (int i = 0; i < index; i++)
  100. cur.e = e;
  101. }
  102. // 查找链表中是否有元素e
  103. public boolean contains(E e) {
  104. Node cur = dummyhead.next;
  105. while (cur != null) {
  106. if (cur.e.equals(e)) // 判断cur.e是否等于用户传来的e
  107. return true;
  108. cur = cur.next;// 依次遍历
  109. }
  110. return false;
  111. }
  112. public String toString() {
  113. StringBuilder res = new StringBuilder();
  114. // Node cur = dummyhead.next;
  115. // while (cur != null) {
  116. // res.append(cur + "->");
  117. // cur = cur.next;
  118. // }
  119. for (Node cur = dummyhead.next; cur != null; cur = cur.next)
  120. res.append(cur + "->");
  121. res.append("NULL");
  122. return res.toString();
  123. }
  124. // 删除链表中第index个元素,并返回删除的元素
  125. public E remove(int index) {
  126. if (index < 0 || index > size) {
  127. try {
  128. throw new Exception("index越界");
  129. } catch (Exception e) {
  130. // TODO Auto-generated catch block
  131. e.printStackTrace();
  132. }
  133. }
  134. Node prev = dummyhead;
  135. for (int i = 0; i < index; i++)
  136. prev = prev.next;
  137. Node retNode = prev.next;// prev.next与retNode所指的都是要删除的节点
  138. prev.next = retNode.next;// prev.next跳过retNode直接指向retNode.next
  139. retNode.next = null;// 垃圾回收retNode.next
  140. size--;
  141. return retNode.e;
  142. }
  143. // 删除链表中第一个元素,返回删除的元素
  144. public E removeFirst() {
  145. return remove(0);
  146. }
  147. // 删除链表中最后一个元素,返回删除的元素
  148. public E removeLast() {
  149. return remove(size - 1);
  150. }
  151. }

Stack.java(栈接口)

  1. public interface Stack<E> {
  2. int getSize();//获取栈中元素个数
  3. boolean isEmpty();//判断栈是否为空
  4. void push(E e);//入栈
  5. E pop();//获取栈顶元素并且出栈
  6. E peek();//查看栈顶元素
  7. }

LinkedListStack.java(链表实现的栈)

  1. public class LinkedListStack<E> implements Stack<E>{
  2. private LinkedList<E> list;
  3. public LinkedListStack() {
  4. // TODO Auto-generated constructor stub
  5. list = new LinkedList<>();
  6. }
  7. @Override
  8. public int getSize() {
  9. // TODO Auto-generated method stub
  10. return list.getSize();
  11. }
  12. @Override
  13. public boolean isEmpty() {
  14. // TODO Auto-generated method stub
  15. return list.isEmpty();
  16. }
  17. @Override
  18. public void push(E e) {
  19. // TODO Auto-generated method stub
  20. list.addFirst(e);
  21. }
  22. @Override
  23. public E pop() {
  24. // TODO Auto-generated method stub
  25. return list.removeFirst();
  26. }
  27. @Override
  28. public E peek() {
  29. // TODO Auto-generated method stub
  30. return list.getFirst();
  31. }
  32. public String toString() {
  33. StringBuilder res = new StringBuilder();
  34. res.append("Stack:top ");
  35. res.append(list);
  36. return res.toString();
  37. }
  38. }

测试(main)

  1. public class StackTest {
  2. public static void main(String[] args) {
  3. LinkedListStack<Integer> stack = new LinkedListStack<>();
  4. for (int i = 0; i < 5; i++) {
  5. stack.push(i);
  6. System.out.println(stack);
  7. }
  8. stack.pop();
  9. System.out.println(stack);
  10. }
  11. }

测试结果
在这里插入图片描述

链表实现的栈的时间复杂度

入栈:O(1)
出栈:O(1)
查询栈顶元素:O(1)

链表栈需要不停的重新new Node,需要在内存中开发内存,如果操作越多,耗时会越长

发表评论

表情:
评论列表 (有 0 条评论,266人围观)

还没有评论,来说两句吧...

相关阅读

    相关 LinkedList(Java)

    链表LinkedList 定义 链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元