mirror of
https://github.com/krahets/hello-algo.git
synced 2026-10-27 00:05:18 +08:00
fix: handle single-node pops in linked-list deques (#1824)
This commit is contained in:
@@ -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; // 更新队列长度
|
||||
|
||||
Reference in New Issue
Block a user