From f2b5aee9044e1ce294b46ba06f6f8905a27af4bd Mon Sep 17 00:00:00 2001 From: Mike <45243121+tankf33der@users.noreply.github.com> Date: Sun, 2 Nov 2025 14:23:25 +0200 Subject: [PATCH] datatypes: fix insert() and delete() for items in second half of DoubleLinkedList[T]{}, add test (#25647) --- vlib/datatypes/doubly_linked_list.v | 4 ++-- vlib/datatypes/doubly_linked_list_test.v | 15 +++++++++++++++ 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/vlib/datatypes/doubly_linked_list.v b/vlib/datatypes/doubly_linked_list.v index 44b8ff770..70e5a413e 100644 --- a/vlib/datatypes/doubly_linked_list.v +++ b/vlib/datatypes/doubly_linked_list.v @@ -165,7 +165,7 @@ pub fn (mut list DoublyLinkedList[T]) insert(idx int, item T) ! { // when idx > list.len/2. This helper function assumes idx bounds have // already been checked and idx is not at the edges. fn (mut list DoublyLinkedList[T]) insert_back(idx int, item T) { - mut node := list.node(idx + 1) + mut node := list.node(idx) mut prev := node.prev // prev node // ------ ------ @@ -226,7 +226,7 @@ fn (list &DoublyLinkedList[T]) node(idx int) &DoublyListNode[T] { return node } mut node := list.tail - for t := list.len - 1; t >= idx; t -= 1 { + for t := list.len - 1; t > idx; t -= 1 { node = node.prev } return node diff --git a/vlib/datatypes/doubly_linked_list_test.v b/vlib/datatypes/doubly_linked_list_test.v index c5582d6ac..060365f77 100644 --- a/vlib/datatypes/doubly_linked_list_test.v +++ b/vlib/datatypes/doubly_linked_list_test.v @@ -136,6 +136,21 @@ fn test_delete() { assert list.len() == 0 } +fn test_insert_delete() { + mut list := DoublyLinkedList[int]{} + elem := [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] + list.push_many(elem, Direction.front) + for i in 0 .. 12 { + list.insert(i, 777)! + assert list.array() != elem + r := list.index(777)! + assert r == i + list.delete(r) + assert list.index(777) or { -7 } == -7 + assert list.array() == elem + } +} + fn test_iter() { mut list := DoublyLinkedList[int]{} for i := 0; i < 10; i++ { -- 2.39.5