On Wed, 30 Mar 2011 11:14:20 -0400, spir <[email protected]> wrote:

On 03/30/2011 03:09 PM, Steven Schveighoffer wrote:
On Wed, 30 Mar 2011 04:55:52 -0400, KennyTM~ <[email protected]> wrote:

No, the big difference is you can't move backward in a singly-linked list. So, for instance, SList can only have linearRemove, while (doubly-linked)
List can have a constant-time remove.

I hate to point it out, but any linked list implementation, whether it be single or double-linked, which does not support O(1) removal is 100% useless.
Might as well use an array.

Do you mean removal of an already accessed node/value? If yes, then removal can effectively be O(1), but to first get the access (here, via a pointer) one needs O(n) traversing the list in any case.

Of course. With SList, you need O(n) to get to the element, and then O(n) to remove it once you find it ;)

This, even when the lookup is by index, unlike arrays for which access is O(n) only when looking for a given value. So, for me O(1) removal is half of the story (same reasoning applies to change, insert, slice...). Or do I miss something?

insert also requires O(n) even with a reference to the insertion point in SList.

As I understand it, link lists are only for "sequential collections" which never change, or only on their front. Thus, I like them for simple lists in the common sense, queue-like collections, or... input/forward ranges ;-). Else, they're close to useless, especiallly in a language like D with it's powerful arrays/slices.

A deque has (amortized) O(1) removal and insertion at the front and end of it, plus has random access.

A list's main bonus is O(1) removal and insertion inside the list. And if you do not keep track of the number of elements, it should also have O(1) splicing (inserting another list in the middle of a list, or removing a section of a list defined by two end points).

-Steve

Reply via email to