使用栈,依次出栈判断连接
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode removeNodes(ListNode head) {
Deque<ListNode> stack = new ArrayDeque<>();
for (; head != null; head = head.next) {
stack.push(head);
}
// 此时head==null
for (; !stack.isEmpty(); stack.pop()) {
if (head == null || stack.peek().val >= head.val) {
stack.peek().next = head;
head = stack.peek();
}
}
return head;
}
}
拓展:
ArrayDeque
和 LinkedList
在实现 Deque
接口时有一些区别:
-
内部实现:
ArrayDeque
使用数组作为其内部数据结构来存储元素。由于数组的特性,它可以提供更快速的随机访问,但在元素超出容量时需要调整数组大小。LinkedList
使用双向链表作为其内部数据结构来存储元素。这使得在链表中插入和删除元素更为高效,但是对于随机访问来说效率较低。
-
性能特点:
- 对于
ArrayDeque
,在大多数情况下,它提供了比LinkedList
更好的性能,特别是对于随机访问和添加/删除元素到队列两端的操作。 LinkedList
对于在中间插入/删除元素的操作更为高效,因为它不需要像数组一样重新分配内存空间。
- 对于
综上所述,选择使用 ArrayDeque
还是 LinkedList
取决于实际需求。如果需要高效的随机访问和在两端进行添加/删除元素的操作,ArrayDeque
更为适合。如果需要频繁地在中间插入/删除元素,那么 LinkedList
可能更合适。
3. Deque:
Deque
是 Java 中的双端队列接口,它代表一个线性集合,支持在两端插入和移除元素。在 Deque
接口中,可以在队列的两端进行插入、移除和检索操作。这意味着可以在队列的两端实现栈(后进先出)和队列(先进先出)等数据结构。
Deque
接口提供了一系列方法,包括 addFirst
, addLast
, offerFirst
, offerLast
, removeFirst
, removeLast
, pollFirst
, pollLast
, getFirst
, getLast
, peekFirst
, peekLast
等,用于操作双端队列的元素。在 Java 中,ArrayDeque
和 LinkedList
都实现了 Deque
接口,因此可以根据实际需求选择使用其中之一。
参考博客:https://blog.csdn.net/weixin_42488513/article/details/120233456