Added a Remove() version to which the previous element needs to be passed as

well. This is rather ugly, but it was the quickest way to provide O(1) element
removal. This class could really use some love.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@39296 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Ingo Weinhold
2010-11-04 14:58:10 +00:00
parent b502275bc8
commit 5609b854b5
+20 -2
View File
@@ -1,6 +1,6 @@
/* /*
* Copyright 2008, Axel Dörfler, [email protected]. All rights reserved. * Copyright 2008, Axel Dörfler, [email protected]. All rights reserved.
* Copyright 2005-2008, Ingo Weinhold, [email protected]. * Copyright 2005-2010, Ingo Weinhold, [email protected].
* *
* Distributed under the terms of the MIT License. * Distributed under the terms of the MIT License.
*/ */
@@ -143,6 +143,7 @@ class SinglyLinkedList {
inline void Add(Element* element); inline void Add(Element* element);
inline void Remove(Element* element); inline void Remove(Element* element);
inline void Remove(Element* previous, Element* element);
inline void MoveFrom(SINGLY_LINKED_LIST_CLASS_NAME* fromList); inline void MoveFrom(SINGLY_LINKED_LIST_CLASS_NAME* fromList);
// O(1) if either list is empty, otherwise O(n). // O(1) if either list is empty, otherwise O(n).
@@ -182,7 +183,7 @@ SINGLY_LINKED_LIST_CLASS_NAME::Add(Element* element)
} }
} }
// Remove
SINGLY_LINKED_LIST_TEMPLATE_LIST SINGLY_LINKED_LIST_TEMPLATE_LIST
void void
SINGLY_LINKED_LIST_CLASS_NAME::Remove(Element* element) SINGLY_LINKED_LIST_CLASS_NAME::Remove(Element* element)
@@ -207,6 +208,23 @@ SINGLY_LINKED_LIST_CLASS_NAME::Remove(Element* element)
} }
SINGLY_LINKED_LIST_TEMPLATE_LIST
void
SINGLY_LINKED_LIST_CLASS_NAME::Remove(Element* previous, Element* element)
{
// ASSERT(previous == NULL
// ? fFirst == element : sGetLink(previous)->next == element);
Link* elementLink = sGetLink(element);
if (previous == NULL)
fFirst = elementLink->next;
else
sGetLink(previous)->next = elementLink->next;
elementLink->next = NULL;
}
SINGLY_LINKED_LIST_TEMPLATE_LIST SINGLY_LINKED_LIST_TEMPLATE_LIST
void void
SINGLY_LINKED_LIST_CLASS_NAME::MoveFrom(SINGLY_LINKED_LIST_CLASS_NAME* fromList) SINGLY_LINKED_LIST_CLASS_NAME::MoveFrom(SINGLY_LINKED_LIST_CLASS_NAME* fromList)