fix: handle single-node pops in linked-list deques (#1824)

This commit is contained in:
KingCrimsonJY
2026-10-10 19:18:20 +08:00
committed by GitHub
parent bd46fca90d
commit 5b279d48b3
12 changed files with 154 additions and 111 deletions
@@ -115,14 +115,19 @@ int pop(LinkedListDeque *deque, bool isFront) {
if (empty(deque))
return -1;
int val;
// 队列长度为 1 时, 头尾指向同一节点
if (deque->queSize == 1) {
val = deque->front->val;
delDoublyListNode(deque->front); // 指向同一节点,释放其一即可
deque->front = NULL;
deque->rear = NULL;
}
// 队首出队操作
if (isFront) {
else if (isFront) {
val = peekFirst(deque); // 暂存头节点值
DoublyListNode *fNext = deque->front->next;
if (fNext) {
fNext->prev = NULL;
deque->front->next = NULL;
}
fNext->prev = NULL;
deque->front->next = NULL;
delDoublyListNode(deque->front);
deque->front = fNext; // 更新头节点
}
@@ -130,10 +135,8 @@ int pop(LinkedListDeque *deque, bool isFront) {
else {
val = peekLast(deque); // 暂存尾节点值
DoublyListNode *rPrev = deque->rear->prev;
if (rPrev) {
rPrev->next = NULL;
deque->rear->prev = NULL;
}
rPrev->next = NULL;
deque->rear->prev = NULL;
delDoublyListNode(deque->rear);
deque->rear = rPrev; // 更新尾节点
}
@@ -84,15 +84,20 @@ class LinkedListDeque {
if (isEmpty())
throw out_of_range("队列为空");
int val;
// 队列长度为 1 时, 头尾指向同一节点
if (queSize == 1) {
val = front->val;
delete front; // 指向同一节点,释放其一即可
front = nullptr;
rear = nullptr;
}
// 队首出队操作
if (isFront) {
else if (isFront) {
val = front->val; // 暂存头节点值
// 删除头节点
DoublyListNode *fNext = front->next;
if (fNext != nullptr) {
fNext->prev = nullptr;
front->next = nullptr;
}
fNext->prev = nullptr;
front->next = nullptr;
delete front;
front = fNext; // 更新头节点
// 队尾出队操作
@@ -100,10 +105,8 @@ class LinkedListDeque {
val = rear->val; // 暂存尾节点值
// 删除尾节点
DoublyListNode *rPrev = rear->prev;
if (rPrev != nullptr) {
rPrev->next = nullptr;
rear->prev = nullptr;
}
rPrev->next = nullptr;
rear->prev = nullptr;
delete rear;
rear = rPrev; // 更新尾节点
}
@@ -74,26 +74,29 @@ public class LinkedListDeque {
if (IsEmpty())
throw new Exception();
int? val;
// 队列长度为 1 时, 头尾指向同一节点
if (queSize == 1)
{
val = front!.val;
front = null;
rear = null;
}
// 队首出队操作
if (isFront) {
val = front?.val; // 暂存头节点值
else if (isFront) {
val = front!.val; // 暂存头节点值
// 删除头节点
ListNode? fNext = front?.next;
if (fNext != null) {
fNext.prev = null;
front!.next = null;
}
fNext!.prev = null;
front.next = null;
front = fNext; // 更新头节点
}
// 队尾出队操作
else {
val = rear?.val; // 暂存尾节点值
val = rear!.val; // 暂存尾节点值
// 删除尾节点
ListNode? rPrev = rear?.prev;
if (rPrev != null) {
rPrev.next = null;
rear!.prev = null;
}
rPrev!.next = null;
rear.prev = null;
rear = rPrev; // 更新尾节点
}
@@ -73,25 +73,27 @@ class LinkedListDeque {
return null;
}
final int val;
if (isFront) {
// 队首出队操作
// 队列长度为 1 时, 头尾指向同一节点
if (_queSize == 1) {
val = _front!.val;
_front = null;
_rear = null;
}
// 队首出队操作
else if (isFront) {
val = _front!.val; // 暂存头节点值
// 删除头节点
ListNode? fNext = _front!.next;
if (fNext != null) {
fNext.prev = null;
_front!.next = null;
}
fNext!.prev = null;
_front!.next = null;
_front = fNext; // 更新头节点
// 队尾出队操作
} else {
// 队尾出队操作
val = _rear!.val; // 暂存尾节点值
// 删除尾节点
ListNode? rPrev = _rear!.prev;
if (rPrev != null) {
rPrev.next = null;
_rear!.prev = null;
}
rPrev!.next = null;
_rear!.prev = null;
_rear = rPrev; // 更新尾节点
}
_queSize--; // 更新队列长度
@@ -76,25 +76,27 @@ class LinkedListDeque {
if (isEmpty())
throw new IndexOutOfBoundsException();
int val;
// 队列长度为 1 时, 头尾指向同一节点
if (queSize == 1) {
val = front.val;
front = null;
rear = null;
}
// 队首出队操作
if (isFront) {
else if (isFront) {
val = front.val; // 暂存头节点值
// 删除头节点
ListNode fNext = front.next;
if (fNext != null) {
fNext.prev = null;
front.next = null;
}
fNext.prev = null;
front.next = null;
front = fNext; // 更新头节点
// 队尾出队操作
} else {
val = rear.val; // 暂存尾节点值
// 删除尾节点
ListNode rPrev = rear.prev;
if (rPrev != null) {
rPrev.next = null;
rear.prev = null;
}
rPrev.next = null;
rear.prev = null;
rear = rPrev; // 更新尾节点
}
queSize--; // 更新队列长度
@@ -67,13 +67,18 @@ class LinkedListDeque {
return null;
}
const value = this.#rear.val; // 存储尾节点值
// 队列长度为 1 时, 头尾指向同一节点
if (this.#queSize === 1) {
this.#front = null;
this.#rear = null;
}
// 删除尾节点
let temp = this.#rear.prev;
if (temp !== null) {
else {
let temp = this.#rear.prev;
temp.next = null;
this.#rear.prev = null;
this.#rear = temp; // 更新尾节点
}
this.#rear = temp; // 更新尾节点
this.#queSize--;
return value;
}
@@ -83,14 +88,19 @@ class LinkedListDeque {
if (this.#queSize === 0) {
return null;
}
const value = this.#front.val; // 存储尾节点值
const value = this.#front.val; // 存储头节点值
// 队列长度为 1 时, 头尾指向同一节点
if (this.#queSize === 1) {
this.#front = null;
this.#rear = null;
}
// 删除头节点
let temp = this.#front.next;
if (temp !== null) {
else {
let temp = this.#front.next;
temp.prev = null;
this.#front.next = null;
this.#front = temp; // 更新头节点
}
this.#front = temp; // 更新头节点
this.#queSize--;
return value;
}
@@ -67,25 +67,27 @@ class LinkedListDeque {
if (isEmpty())
throw IndexOutOfBoundsException()
val _val: Int
// 队列长度为 1 时, 头尾指向同一节点
if (queSize == 1) {
_val = front!!._val
front = null
rear = null
}
// 队首出队操作
if (isFront) {
else if (isFront) {
_val = front!!._val // 暂存头节点值
// 删除头节点
val fNext = front!!.next
if (fNext != null) {
fNext.prev = null
front!!.next = null
}
fNext!!.prev = null
front!!.next = null
front = fNext // 更新头节点
// 队尾出队操作
} else {
_val = rear!!._val // 暂存尾节点值
// 删除尾节点
val rPrev = rear!!.prev
if (rPrev != null) {
rPrev.next = null
rear!!.prev = null
}
rPrev!!.next = null
rear!!.prev = null
rear = rPrev // 更新尾节点
}
queSize-- // 更新队列长度
@@ -64,23 +64,26 @@ class LinkedListDeque:
"""出队操作"""
if self.is_empty():
raise IndexError("双向队列为空")
# 队列长度为 1 时, 头尾指向同一节点
if self._size == 1:
val: int = self._front.val
self._front = None
self._rear = None
# 队首出队操作
if is_front:
elif is_front:
val: int = self._front.val # 暂存头节点值
# 删除头节点
fnext: ListNode | None = self._front.next
if fnext is not None:
fnext.prev = None
self._front.next = None
fnext.prev = None
self._front.next = None
self._front = fnext # 更新头节点
# 队尾出队操作
else:
val: int = self._rear.val # 暂存尾节点值
# 删除尾节点
rprev: ListNode | None = self._rear.prev
if rprev is not None:
rprev.next = None
self._rear.prev = None
rprev.next = None
self._rear.prev = None
self._rear = rprev # 更新尾节点
self._size -= 1 # 更新队列长度
return val
@@ -69,25 +69,26 @@ class LinkedListDeque
def pop(is_front)
raise IndexError, '双向队列为空' if is_empty?
# 队列长度为 1 时, 头尾指向同一节点
if @size == 1
val = @front.val
@front = nil
@rear = nil
# 队首出队操作
if is_front
elsif is_front
val = @front.val # 暂存头节点值
# 删除头节点
fnext = @front.next
unless fnext.nil?
fnext.prev = nil
@front.next = nil
end
fnext.prev = nil
@front.next = nil
@front = fnext # 更新头节点
# 队尾出队操作
else
val = @rear.val # 暂存尾节点值
# 删除尾节点
rprev = @rear.prev
unless rprev.nil?
rprev.next = nil
@rear.prev = nil
end
rprev.next = nil
@rear.prev = nil
@rear = rprev # 更新尾节点
end
@size -= 1 # 更新队列长度
@@ -76,15 +76,19 @@ class LinkedListDeque {
fatalError("双向队列为空")
}
let val: Int
// 队列长度为 1 时, 头尾指向同一节点
if _size == 1 {
val = front!.val
front = nil
rear = nil
}
// 队首出队操作
if isFront {
else if isFront {
val = front!.val // 暂存头节点值
// 删除头节点
let fNext = front?.next
if fNext != nil {
fNext?.prev = nil
front?.next = nil
}
fNext?.prev = nil
front?.next = nil
front = fNext // 更新头节点
}
// 队尾出队操作
@@ -92,10 +96,8 @@ class LinkedListDeque {
val = rear!.val // 暂存尾节点值
// 删除尾节点
let rPrev = rear?.prev
if rPrev != nil {
rPrev?.next = nil
rear?.prev = nil
}
rPrev?.next = nil
rear?.prev = nil
rear = rPrev // 更新尾节点
}
_size -= 1 // 更新队列长度
@@ -66,14 +66,19 @@ class LinkedListDeque {
if (this.queSize === 0) {
return null;
}
const value: number = this.rear.val; // 存储尾节点值
const value: number = this.rear!.val; // 存储尾节点值
// 队列长度为 1 时, 头尾指向同一节点
if (this.queSize === 1) {
this.front = null;
this.rear = null;
}
// 删除尾节点
let temp: ListNode = this.rear.prev;
if (temp !== null) {
temp.next = null;
this.rear.prev = null;
else {
let temp: ListNode = this.rear!.prev;
temp!.next = null;
this.rear!.prev = null;
this.rear = temp; // 更新尾节点
}
this.rear = temp; // 更新尾节点
this.queSize--;
return value;
}
@@ -83,14 +88,19 @@ class LinkedListDeque {
if (this.queSize === 0) {
return null;
}
const value: number = this.front.val; // 存储尾节点值
const value: number = this.front.val; // 存储头节点值
// 队列长度为 1 时, 头尾指向同一节点
if (this.queSize === 1) {
this.front = null;
this.rear = null;
}
// 删除头节点
let temp: ListNode = this.front.next;
if (temp !== null) {
temp.prev = null;
this.front.next = null;
else {
let temp: ListNode = this.front!.next;
temp!.prev = null;
this.front!.next = null;
this.front = temp; // 更新头节点
}
this.front = temp; // 更新头节点
this.queSize--;
return value;
}
@@ -99,25 +99,27 @@ pub fn LinkedListDeque(comptime T: type) type {
pub fn pop(self: *Self, is_front: bool) T {
if (self.isEmpty()) @panic("双向队列为空");
var val: T = undefined;
// 队列长度为 1 时, 头尾指向同一节点
if (self.que_size == 1) {
val = self.front.?.val;
self.front = null;
self.rear = null;
}
// 队首出队操作
if (is_front) {
else if (is_front) {
val = self.front.?.val; // 暂存头节点值
// 删除头节点
var fNext = self.front.?.next;
if (fNext != null) {
fNext.?.prev = null;
self.front.?.next = null;
}
fNext.?.prev = null;
self.front.?.next = null;
self.front = fNext; // 更新头节点
// 队尾出队操作
} else {
val = self.rear.?.val; // 暂存尾节点值
// 删除尾节点
var rPrev = self.rear.?.prev;
if (rPrev != null) {
rPrev.?.next = null;
self.rear.?.prev = null;
}
rPrev.?.next = null;
self.rear.?.prev = null;
self.rear = rPrev; // 更新尾节点
}
self.que_size -= 1; // 更新队列长度