When is it better to use a List vs a LinkedList?
Thinking of a linked list as a list can be a bit misleading. It's more like a chain. In fact, in .NET, LinkedList
does not even implement IList
. There is no real concept of index in a linked list, even though it may seem there is. Certainly none of the methods provided on the class accept indexes.
Linked lists may be singly linked, or doubly linked. This refers to whether each element in the chain has a link only to the next one (singly linked) or to both the prior/next elements (doubly linked). LinkedList
is doubly linked.
Internally, List
is backed by an array. This provides a very compact representation in memory. Conversely, LinkedList
involves additional memory to store the bidirectional links between successive elements. So the memory footprint of a LinkedList
will generally be larger than for List
(with the caveat that List
can have unused internal array elements to improve performance during append operations.)
They have different performance characteristics too:
LinkedList.AddLast(item)
constant timeList.Add(item)
amortized constant time, linear worst caseLinkedList.AddFirst(item)
constant timeList.Insert(0, item)
linear timeLinkedList.AddBefore(node, item)
constant timeLinkedList.AddAfter(node, item)
constant timeList.Insert(index, item)
linear timeLinkedList.Remove(item)
linear timeLinkedList.Remove(node)
constant timeList.Remove(item)
linear timeList.RemoveAt(index)
linear timeLinkedList.Count
constant timeList.Count
constant timeLinkedList.Contains(item)
linear timeList.Contains(item)
linear timeLinkedList.Clear()
linear timeList.Clear()
linear timeAs you can see, they're mostly equivalent. In practice, the API of LinkedList
is more cumbersome to use, and details of its internal needs spill out into your code.
However, if you need to do many insertions/removals from within a list, it offers constant time. List
offers linear time, as extra items in the list must be shuffled around after the insertion/removal.