On this page
lists
Implementation of:
- singly linked lists
- doubly linked lists
- singly linked rings (circular lists)
- doubly linked rings (circular lists)
Basic Usage
Because it makes no sense to do otherwise, the next
and prev
pointers are not hidden from you and can be manipulated directly for efficiency.
Lists
import lists
var
l = initDoublyLinkedList[int]()
a = newDoublyLinkedNode[int](3)
b = newDoublyLinkedNode[int](7)
c = newDoublyLinkedNode[int](9)
l.append(a)
l.append(b)
l.prepend(c)
assert a.next == b
assert a.prev == c
assert c.next == a
assert c.next.next == b
assert c.prev == nil
assert b.next == nil
Rings
import lists
var
l = initSinglyLinkedRing[int]()
a = newSinglyLinkedNode[int](3)
b = newSinglyLinkedNode[int](7)
c = newSinglyLinkedNode[int](9)
l.append(a)
l.append(b)
l.prepend(c)
assert c.next == a
assert a.next == b
assert c.next.next == b
assert b.next == c
assert c.next.next.next == c
See also
- deques module for double-ended queues
- sharedlist module for shared singly-linked lists
Types
-
DoublyLinkedNodeObj[T] = object next*: (ref DoublyLinkedNodeObj[T]) prev* {...}{.cursor.}: ref DoublyLinkedNodeObj[T] value*: T
-
A node a doubly linked list consists of.
It consists of a
Source Editvalue
field, and pointers tonext
andprev
. -
DoublyLinkedNode[T] = ref DoublyLinkedNodeObj[T]
- Source Edit
-
SinglyLinkedNodeObj[T] = object next*: (ref SinglyLinkedNodeObj[T]) value*: T
-
A node a singly linked list consists of.
It consists of a
Source Editvalue
field, and a pointer tonext
. -
SinglyLinkedNode[T] = ref SinglyLinkedNodeObj[T]
- Source Edit
-
SinglyLinkedList[T] = object head*: (SinglyLinkedNode[T]) tail* {...}{.cursor.}: SinglyLinkedNode[T]
-
A singly linked list.
Use initSinglyLinkedList proc to create a new empty list.
Source Edit -
DoublyLinkedList[T] = object head*: (DoublyLinkedNode[T]) tail* {...}{.cursor.}: DoublyLinkedNode[T]
-
A doubly linked list.
Use initDoublyLinkedList proc to create a new empty list.
Source Edit -
SinglyLinkedRing[T] = object head*: (SinglyLinkedNode[T]) tail* {...}{.cursor.}: SinglyLinkedNode[T]
-
A singly linked ring.
Use initSinglyLinkedRing proc to create a new empty ring.
Source Edit -
DoublyLinkedRing[T] = object head*: DoublyLinkedNode[T]
-
A doubly linked ring.
Use initDoublyLinkedRing proc to create a new empty ring.
Source Edit -
SomeLinkedList[T] = SinglyLinkedList[T] | DoublyLinkedList[T]
- Source Edit
-
SomeLinkedRing[T] = SinglyLinkedRing[T] | DoublyLinkedRing[T]
- Source Edit
-
SomeLinkedCollection[T] = SomeLinkedList[T] | SomeLinkedRing[T]
- Source Edit
-
SomeLinkedNode[T] = SinglyLinkedNode[T] | DoublyLinkedNode[T]
- Source Edit
Procs
-
proc initSinglyLinkedList[T](): SinglyLinkedList[T]
-
Creates a new singly linked list that is empty.
Example:
Source Editvar a = initSinglyLinkedList[int]()
-
proc initDoublyLinkedList[T](): DoublyLinkedList[T]
-
Creates a new doubly linked list that is empty.
Example:
Source Editvar a = initDoublyLinkedList[int]()
-
proc initSinglyLinkedRing[T](): SinglyLinkedRing[T]
-
Creates a new singly linked ring that is empty.
Example:
Source Editvar a = initSinglyLinkedRing[int]()
-
proc initDoublyLinkedRing[T](): DoublyLinkedRing[T]
-
Creates a new doubly linked ring that is empty.
Example:
Source Editvar a = initDoublyLinkedRing[int]()
-
proc newDoublyLinkedNode[T](value: T): (DoublyLinkedNode[T])
-
Creates a new doubly linked node with the given
value
.Example:
Source Editvar n = newDoublyLinkedNode[int](5) assert n.value == 5
-
proc newSinglyLinkedNode[T](value: T): (SinglyLinkedNode[T])
-
Creates a new singly linked node with the given
value
.Example:
Source Editvar n = newSinglyLinkedNode[int](5) assert n.value == 5
-
proc `$`[T](L: SomeLinkedCollection[T]): string
- Turns a list into its string representation for logging and printing. Source Edit
-
proc find[T](L: SomeLinkedCollection[T]; value: T): SomeLinkedNode[T]
-
Searches in the list for a value. Returns
nil
if the value does not exist.See also:
Example:
Source Editvar a = initSinglyLinkedList[int]() a.append(9) a.append(8) assert a.find(9).value == 9 assert a.find(1) == nil
-
proc contains[T](L: SomeLinkedCollection[T]; value: T): bool {...}{.inline.}
-
Searches in the list for a value. Returns
false
if the value does not exist,true
otherwise.See also:
Example:
Source Editvar a = initSinglyLinkedList[int]() a.append(9) a.append(8) assert a.contains(9) assert 8 in a assert(not a.contains(1)) assert 2 notin a
-
proc append[T](L: var SinglyLinkedList[T]; n: SinglyLinkedNode[T]) {...}{.inline.}
-
Appends (adds to the end) a node
n
toL
. Efficiency: O(1).See also:
- append proc for appending a value
- prepend proc for prepending a node
- prepend proc for prepending a value
Example:
Source Editvar a = initSinglyLinkedList[int]() n = newSinglyLinkedNode[int](9) a.append(n) assert a.contains(9)
-
proc append[T](L: var SinglyLinkedList[T]; value: T) {...}{.inline.}
-
Appends (adds to the end) a value to
L
. Efficiency: O(1).See also:
- append proc for appending a value
- prepend proc for prepending a node
- prepend proc for prepending a value
Example:
Source Editvar a = initSinglyLinkedList[int]() a.append(9) a.append(8) assert a.contains(9)
-
proc prepend[T](L: var SinglyLinkedList[T]; n: SinglyLinkedNode[T]) {...}{.inline.}
-
Prepends (adds to the beginning) a node to
L
. Efficiency: O(1).See also:
- append proc for appending a node
- append proc for appending a value
- prepend proc for prepending a value
Example:
Source Editvar a = initSinglyLinkedList[int]() n = newSinglyLinkedNode[int](9) a.prepend(n) assert a.contains(9)
-
proc prepend[T](L: var SinglyLinkedList[T]; value: T) {...}{.inline.}
-
Prepends (adds to the beginning) a node to
L
. Efficiency: O(1).See also:
- append proc for appending a node
- append proc for appending a value
- prepend proc for prepending a node
Example:
Source Editvar a = initSinglyLinkedList[int]() a.prepend(9) a.prepend(8) assert a.contains(9)
-
proc append[T](L: var DoublyLinkedList[T]; n: DoublyLinkedNode[T])
-
Appends (adds to the end) a node
n
toL
. Efficiency: O(1).See also:
- append proc for appending a value
- prepend proc for prepending a node
- prepend proc for prepending a value
- remove proc for removing a node
Example:
Source Editvar a = initDoublyLinkedList[int]() n = newDoublyLinkedNode[int](9) a.append(n) assert a.contains(9)
-
proc append[T](L: var DoublyLinkedList[T]; value: T)
-
Appends (adds to the end) a value to
L
. Efficiency: O(1).See also:
- append proc for appending a node
- prepend proc for prepending a node
- prepend proc for prepending a value
- remove proc for removing a node
Example:
Source Editvar a = initDoublyLinkedList[int]() a.append(9) a.append(8) assert a.contains(9)
-
proc prepend[T](L: var DoublyLinkedList[T]; n: DoublyLinkedNode[T])
-
Prepends (adds to the beginning) a node
n
toL
. Efficiency: O(1).See also:
- append proc for appending a node
- append proc for appending a value
- prepend proc for prepending a value
- remove proc for removing a node
Example:
Source Editvar a = initDoublyLinkedList[int]() n = newDoublyLinkedNode[int](9) a.prepend(n) assert a.contains(9)
-
proc prepend[T](L: var DoublyLinkedList[T]; value: T)
-
Prepends (adds to the beginning) a value to
L
. Efficiency: O(1).See also:
- append proc for appending a node
- append proc for appending a value
- prepend proc for prepending a node
- remove proc for removing a node
Example:
Source Editvar a = initDoublyLinkedList[int]() a.prepend(9) a.prepend(8) assert a.contains(9)
-
proc remove[T](L: var DoublyLinkedList[T]; n: DoublyLinkedNode[T])
-
Removes a node
n
fromL
. Efficiency: O(1).Example:
Source Editvar a = initDoublyLinkedList[int]() n = newDoublyLinkedNode[int](5) a.append(n) assert 5 in a a.remove(n) assert 5 notin a
-
proc append[T](L: var SinglyLinkedRing[T]; n: SinglyLinkedNode[T])
-
Appends (adds to the end) a node
n
toL
. Efficiency: O(1).See also:
- append proc for appending a value
- prepend proc for prepending a node
- prepend proc for prepending a value
Example:
Source Editvar a = initSinglyLinkedRing[int]() n = newSinglyLinkedNode[int](9) a.append(n) assert a.contains(9)
-
proc append[T](L: var SinglyLinkedRing[T]; value: T)
-
Appends (adds to the end) a value to
L
. Efficiency: O(1).See also:
- append proc for appending a node
- prepend proc for prepending a node
- prepend proc for prepending a value
Example:
Source Editvar a = initSinglyLinkedRing[int]() a.append(9) a.append(8) assert a.contains(9)
-
proc prepend[T](L: var SinglyLinkedRing[T]; n: SinglyLinkedNode[T])
-
Prepends (adds to the beginning) a node
n
toL
. Efficiency: O(1).See also:
- append proc for appending a node
- append proc for appending a value
- prepend proc for prepending a value
Example:
Source Editvar a = initSinglyLinkedRing[int]() n = newSinglyLinkedNode[int](9) a.prepend(n) assert a.contains(9)
-
proc prepend[T](L: var SinglyLinkedRing[T]; value: T)
-
Prepends (adds to the beginning) a value to
L
. Efficiency: O(1).See also:
- append proc for appending a node
- append proc for appending a value
- prepend proc for prepending a node
Example:
Source Editvar a = initSinglyLinkedRing[int]() a.prepend(9) a.prepend(8) assert a.contains(9)
-
proc append[T](L: var DoublyLinkedRing[T]; n: DoublyLinkedNode[T])
-
Appends (adds to the end) a node
n
toL
. Efficiency: O(1).See also:
- append proc for appending a value
- prepend proc for prepending a node
- prepend proc for prepending a value
- remove proc for removing a node
Example:
Source Editvar a = initDoublyLinkedRing[int]() n = newDoublyLinkedNode[int](9) a.append(n) assert a.contains(9)
-
proc append[T](L: var DoublyLinkedRing[T]; value: T)
-
Appends (adds to the end) a value to
L
. Efficiency: O(1).See also:
- append proc for appending a node
- prepend proc for prepending a node
- prepend proc for prepending a value
- remove proc for removing a node
Example:
Source Editvar a = initDoublyLinkedRing[int]() a.append(9) a.append(8) assert a.contains(9)
-
proc prepend[T](L: var DoublyLinkedRing[T]; n: DoublyLinkedNode[T])
-
Prepends (adds to the beginning) a node
n
toL
. Efficiency: O(1).See also:
- append proc for appending a node
- append proc for appending a value
- prepend proc for prepending a value
- remove proc for removing a node
Example:
Source Editvar a = initDoublyLinkedRing[int]() n = newDoublyLinkedNode[int](9) a.prepend(n) assert a.contains(9)
-
proc prepend[T](L: var DoublyLinkedRing[T]; value: T)
-
Prepends (adds to the beginning) a value to
L
. Efficiency: O(1).See also:
- append proc for appending a node
- append proc for appending a value
- prepend proc for prepending a node
- remove proc for removing a node
Example:
Source Editvar a = initDoublyLinkedRing[int]() a.prepend(9) a.prepend(8) assert a.contains(9)
-
proc remove[T](L: var DoublyLinkedRing[T]; n: DoublyLinkedNode[T])
-
Removes
n
fromL
. Efficiency: O(1).Example:
Source Editvar a = initDoublyLinkedRing[int]() n = newDoublyLinkedNode[int](5) a.append(n) assert 5 in a a.remove(n) assert 5 notin a
Iterators
-
iterator items[T](L: SomeLinkedList[T]): T
-
Yields every value of
L
.See also:
Examples:
Source Editvar a = initSinglyLinkedList[int]() for i in 1 .. 3: a.append(10*i) for x in a: # the same as: for x in items(a): echo x # 10 # 20 # 30
-
iterator items[T](L: SomeLinkedRing[T]): T
-
Yields every value of
L
.See also:
Examples:
Source Editvar a = initSinglyLinkedRing[int]() for i in 1 .. 3: a.append(10*i) for x in a: # the same as: for x in items(a): echo x # 10 # 20 # 30
-
iterator mitems[T](L: var SomeLinkedList[T]): var T
-
Yields every value of
L
so that you can modify it.See also:
Example:
Source Editvar a = initSinglyLinkedList[int]() for i in 1 .. 5: a.append(10*i) assert $a == "[10, 20, 30, 40, 50]" for x in mitems(a): x = 5*x - 1 assert $a == "[49, 99, 149, 199, 249]"
-
iterator mitems[T](L: var SomeLinkedRing[T]): var T
-
Yields every value of
L
so that you can modify it.See also:
Example:
Source Editvar a = initSinglyLinkedRing[int]() for i in 1 .. 5: a.append(10*i) assert $a == "[10, 20, 30, 40, 50]" for x in mitems(a): x = 5*x - 1 assert $a == "[49, 99, 149, 199, 249]"
-
iterator nodes[T](L: SomeLinkedList[T]): SomeLinkedNode[T]
-
Iterates over every node of
x
. Removing the current node from the list during traversal is supported.See also:
Example:
Source Editvar a = initDoublyLinkedList[int]() for i in 1 .. 5: a.append(10*i) assert $a == "[10, 20, 30, 40, 50]" for x in nodes(a): if x.value == 30: a.remove(x) else: x.value = 5*x.value - 1 assert $a == "[49, 99, 199, 249]"
-
iterator nodes[T](L: SomeLinkedRing[T]): SomeLinkedNode[T]
-
Iterates over every node of
x
. Removing the current node from the list during traversal is supported.See also:
Example:
Source Editvar a = initDoublyLinkedRing[int]() for i in 1 .. 5: a.append(10*i) assert $a == "[10, 20, 30, 40, 50]" for x in nodes(a): if x.value == 30: a.remove(x) else: x.value = 5*x.value - 1 assert $a == "[49, 99, 199, 249]"
© 2006–2021 Andreas Rumpf
Licensed under the MIT License.
https://nim-lang.org/docs/lists.html