LinkedList 很实用,但光看源码是不够的,需要我们用起来,在用的过程中深入了解它。
LinkedList实现了List<E>接口,我们可以像使用ArrayList一样,通过add(i)、add(index,i)、get(index)等一系列方法操作访问它。
LinkedList还实现了Deque双端队列接口,Deque又是Queue的子接口,我们可以像操作栈、队列一样操作它。
下面就看LinkedList在栈、队列、双端队列的应用示例。
1、栈(Stack)
栈是一种后进先出(LIFO, Last In First Out) 的数据结构。
LinkedList 通过 Deque 接口实现了栈,可以在头部进行插入和删除操作,使用 push 和 pop 方法实现栈结构,符合后进先出(FILO)原则,操作集中在链表的头部,效率高。
应用示例:
// 栈实现
LinkedList<Integer> stackList = new LinkedList<>();
// 先进,入栈操作
stackList.push(1);
stackList.push(2);
// 后进,入栈操作
stackList.push(3);
// 查看栈顶元素,后进先出
System.out.println(stackList.pop()); // 输出:3
System.out.println(stackList); // 输出:[2,1]
push入栈操作,pop出站操作。
除此之外,我们还可以用 LinkedList 的 addFirst()方法将元素插入到栈顶,用 removeFirst()方法移除栈顶元素。但是我还是觉得使用push和pop更明了一些。
2、队列 (Queue)
队列是一种先进先出(FIFO, First In First Out)的数据结构。
LinkedList 通过 Queue 接口实现了队列,支持 offer 和 poll 方法,符合先进先出(FIFO)原则,尤其适合需要频繁插入和移除头尾元素的场景。
LinkedList<Integer> queueList = new LinkedList<>();
// 先进,入队操作
queueList.offer(1);
queueList.offer(2);
// 后进
queueList.offer(3);
// 先进先出,出队操作
System.out.println(queueList.poll()); //输出: 1
System.out.println(queueList); //输出: [2, 3]
offer入队操作,poll出队操作。
在看源码的时候,发现offer方法调用了add方法,因此它和下面代码是等价的。
LinkedList<Integer> queueList1 = new LinkedList<>();
// 先进,入队操作
queueList1.add(1);
queueList1.add(2);
// 后进
queueList1.add(3);
// 先进先出,出队操作
System.out.println(queueList1.remove()); //输出: 1
System.out.println(queueList1); //输出: [2, 3]
add入队操作,remove出队操作。
除此之外,还可以使用 LinkedList 的 addLast() 方法将元素插入到队尾,用 removeFirst() 方法移除队头元素。
3、双端队列 (Deque)
双端队列是一种支持在两端插入和删除元素的数据结构,可以既当作栈来使用(在一端操作),也可以当作队列来使用(在两端操作)。
LinkedList 通过 Deque 接口实现了双端队列,可以在头尾进行插入和删除操作,适合需要灵活操作队列两端的情况。
// 双端队列
LinkedList<Integer> dequeList = new LinkedList<>();
// 从队头添加元素
dequeList.addFirst(5);
dequeList.addFirst(6);
System.out.println(dequeList); // [6, 5]
// 从队尾添加元素
dequeList.addLast(10);
dequeList.addLast(11);
System.out.println(dequeList); // [6, 5, 10, 11]
// 查看队头元素
System.out.println(dequeList.getFirst()); // 6
// 查看队尾元素
System.out.println(dequeList.getLast()); // 11
// 从队头移除元素
System.out.println(dequeList.removeFirst()); // 6
// 从队尾移除元素
System.out.println(dequeList.removeLast()); // 11
System.out.println(dequeList); // [5, 10]
addFirst 和 addLast 方法:分别在双端队列的头部和尾部添加元素。
removeFirst 和 removeLast 方法:分别从双端队列的头部和尾部移除元素。
getFirst 和 getLast 方法:分别查看队头和队尾的元素,但不移除。
LinkedList 里面的方法太多,通过示例希望我们可以快速地应用它。
领取专属 10元无门槛券
私享最新 技术干货