8.1:双向链表实现双端队列
8.1:双向链表实现双端队列
双端队列,玩的head 和tail指针
底层都是双链表调整
1、双向链表
节点
1 public static class Node<T> {
2 public T value;
3 public Node<T> last;
4 public Node<T> next;
5
6 public Node(T data) {
7 value = data;
8 }
9 }
双向链表实现节点定义
1 public static class DoubleEndsQueue<T> {
2 public Node<T> head;
3 public Node<T> tail;
4
5 public void addFromHead(T value) {
6 Node<T> cur = new Node<T>(value);
7 if (head == null) {
8 head = cur;
9 tail = cur;
10 } else {
11 cur.next = head;
12 head.last = cur;
13 head = cur;
14 }
15 }
16
17 public void addFromBottom(T value) {
18 Node<T> cur = new Node<T>(value);
19 if (head == null) {
20 head = cur;
21 tail = cur;
22 } else {
23 cur.last = tail;
24 tail.next = cur;
25 tail = cur;
26 }
27 }
28
29 public T popFromHead() {
30 if (head == null) {
31 return null;
32 }
33 Node<T> cur = head;
34 if (head == tail) {
35 head = null;
36 tail = null;
37 } else {
38 head = head.next;
39 cur.next = null;
40 head.last = null;
41 }
42 return cur.value;
43 }
44
45 public T popFromBottom() {
46 if (head == null) {
47 return null;
48 }
49 Node<T> cur = tail;
50 if (head == tail) {
51 head = null;
52 tail = null;
53 } else {
54 tail = tail.last;
55 tail.next = null;
56 cur.last = null;
57 }
58 return cur.value;
59 }
60
61 public boolean isEmpty() {
62 return head == null;
63 }
64
65 }
定义双端队列
1 public static class MyQueue<T> {
2 private DoubleEndsQueue<T> queue;
3
4 public MyQueue() {
5 queue = new DoubleEndsQueue<T>();
6 }
7
8 public void push(T value) {
9 queue.addFromHead(value);
10 }
11
12 public T poll() {
13 return queue.popFromBottom();
14 }
15
16 public boolean isEmpty() {
17 return queue.isEmpty();
18 }
19
20 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术