diff --git a/codes/c/chapter_stack_and_queue/linkedlist_deque.c b/codes/c/chapter_stack_and_queue/linkedlist_deque.c index f28671683c..367554cc7b 100644 --- a/codes/c/chapter_stack_and_queue/linkedlist_deque.c +++ b/codes/c/chapter_stack_and_queue/linkedlist_deque.c @@ -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; // 更新尾节点 } diff --git a/codes/cpp/chapter_stack_and_queue/linkedlist_deque.cpp b/codes/cpp/chapter_stack_and_queue/linkedlist_deque.cpp index 7eea86cee7..0fb057e288 100644 --- a/codes/cpp/chapter_stack_and_queue/linkedlist_deque.cpp +++ b/codes/cpp/chapter_stack_and_queue/linkedlist_deque.cpp @@ -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; // 更新尾节点 } diff --git a/codes/csharp/chapter_stack_and_queue/linkedlist_deque.cs b/codes/csharp/chapter_stack_and_queue/linkedlist_deque.cs index d2c51c1a53..a2809ccd7a 100644 --- a/codes/csharp/chapter_stack_and_queue/linkedlist_deque.cs +++ b/codes/csharp/chapter_stack_and_queue/linkedlist_deque.cs @@ -74,26 +74,29 @@ public void PushLast(int num) { 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; // 更新尾节点 } diff --git a/codes/dart/chapter_stack_and_queue/linkedlist_deque.dart b/codes/dart/chapter_stack_and_queue/linkedlist_deque.dart index 08d0dd8071..1dfb0be39e 100644 --- a/codes/dart/chapter_stack_and_queue/linkedlist_deque.dart +++ b/codes/dart/chapter_stack_and_queue/linkedlist_deque.dart @@ -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--; // 更新队列长度 diff --git a/codes/java/chapter_stack_and_queue/linkedlist_deque.java b/codes/java/chapter_stack_and_queue/linkedlist_deque.java index 41a1bfbd30..37bdaa036f 100644 --- a/codes/java/chapter_stack_and_queue/linkedlist_deque.java +++ b/codes/java/chapter_stack_and_queue/linkedlist_deque.java @@ -76,25 +76,27 @@ private int pop(boolean isFront) { 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--; // 更新队列长度 diff --git a/codes/javascript/chapter_stack_and_queue/linkedlist_deque.js b/codes/javascript/chapter_stack_and_queue/linkedlist_deque.js index 884b2313b6..37af91b07f 100644 --- a/codes/javascript/chapter_stack_and_queue/linkedlist_deque.js +++ b/codes/javascript/chapter_stack_and_queue/linkedlist_deque.js @@ -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; } diff --git a/codes/kotlin/chapter_stack_and_queue/linkedlist_deque.kt b/codes/kotlin/chapter_stack_and_queue/linkedlist_deque.kt index 88ad608271..c18c60570b 100644 --- a/codes/kotlin/chapter_stack_and_queue/linkedlist_deque.kt +++ b/codes/kotlin/chapter_stack_and_queue/linkedlist_deque.kt @@ -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-- // 更新队列长度 diff --git a/codes/python/chapter_stack_and_queue/linkedlist_deque.py b/codes/python/chapter_stack_and_queue/linkedlist_deque.py index 29aa0dfa11..981eceb96d 100644 --- a/codes/python/chapter_stack_and_queue/linkedlist_deque.py +++ b/codes/python/chapter_stack_and_queue/linkedlist_deque.py @@ -64,23 +64,26 @@ def pop(self, is_front: bool) -> int: """出队操作""" 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 diff --git a/codes/ruby/chapter_stack_and_queue/linkedlist_deque.rb b/codes/ruby/chapter_stack_and_queue/linkedlist_deque.rb index 4b901a853f..a138827eb1 100644 --- a/codes/ruby/chapter_stack_and_queue/linkedlist_deque.rb +++ b/codes/ruby/chapter_stack_and_queue/linkedlist_deque.rb @@ -69,25 +69,26 @@ def push_last(num) 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 # 更新队列长度 diff --git a/codes/swift/chapter_stack_and_queue/linkedlist_deque.swift b/codes/swift/chapter_stack_and_queue/linkedlist_deque.swift index d5318294eb..64a0d2ac5e 100644 --- a/codes/swift/chapter_stack_and_queue/linkedlist_deque.swift +++ b/codes/swift/chapter_stack_and_queue/linkedlist_deque.swift @@ -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 // 更新队列长度 diff --git a/codes/typescript/chapter_stack_and_queue/linkedlist_deque.ts b/codes/typescript/chapter_stack_and_queue/linkedlist_deque.ts index dd1c50bba9..f4ae6ed7cd 100644 --- a/codes/typescript/chapter_stack_and_queue/linkedlist_deque.ts +++ b/codes/typescript/chapter_stack_and_queue/linkedlist_deque.ts @@ -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; } diff --git a/codes/zig/chapter_stack_and_queue/linkedlist_deque.zig b/codes/zig/chapter_stack_and_queue/linkedlist_deque.zig index 7a42ce7483..a8e9a31aa6 100644 --- a/codes/zig/chapter_stack_and_queue/linkedlist_deque.zig +++ b/codes/zig/chapter_stack_and_queue/linkedlist_deque.zig @@ -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; // 更新队列长度