lists.nim 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737
  1. #
  2. #
  3. # Nim's Runtime Library
  4. # (c) Copyright 2012 Andreas Rumpf
  5. #
  6. # See the file "copying.txt", included in this
  7. # distribution, for details about the copyright.
  8. #
  9. ## Implementation of:
  10. ## * `singly linked lists <#SinglyLinkedList>`_
  11. ## * `doubly linked lists <#DoublyLinkedList>`_
  12. ## * `singly linked rings <#SinglyLinkedRing>`_ (circular lists)
  13. ## * `doubly linked rings <#DoublyLinkedRing>`_ (circular lists)
  14. ##
  15. ##
  16. ## Basic Usage
  17. ## ===========
  18. ##
  19. ## Because it makes no sense to do otherwise, the `next` and `prev` pointers
  20. ## are not hidden from you and can be manipulated directly for efficiency.
  21. ##
  22. ## Lists
  23. ## -----
  24. ##
  25. ## .. code-block::
  26. ## import lists
  27. ##
  28. ## var
  29. ## l = initDoublyLinkedList[int]()
  30. ## a = newDoublyLinkedNode[int](3)
  31. ## b = newDoublyLinkedNode[int](7)
  32. ## c = newDoublyLinkedNode[int](9)
  33. ##
  34. ## l.append(a)
  35. ## l.append(b)
  36. ## l.prepend(c)
  37. ##
  38. ## assert a.next == b
  39. ## assert a.prev == c
  40. ## assert c.next == a
  41. ## assert c.next.next == b
  42. ## assert c.prev == nil
  43. ## assert b.next == nil
  44. ##
  45. ##
  46. ## Rings
  47. ## -----
  48. ##
  49. ## .. code-block::
  50. ## import lists
  51. ##
  52. ## var
  53. ## l = initSinglyLinkedRing[int]()
  54. ## a = newSinglyLinkedNode[int](3)
  55. ## b = newSinglyLinkedNode[int](7)
  56. ## c = newSinglyLinkedNode[int](9)
  57. ##
  58. ## l.append(a)
  59. ## l.append(b)
  60. ## l.prepend(c)
  61. ##
  62. ## assert c.next == a
  63. ## assert a.next == b
  64. ## assert c.next.next == b
  65. ## assert b.next == c
  66. ## assert c.next.next.next == c
  67. ##
  68. ## See also
  69. ## ========
  70. ##
  71. ## * `deques module <deques.html>`_ for double-ended queues
  72. ## * `sharedlist module <sharedlist.html>`_ for shared singly-linked lists
  73. when not defined(nimhygiene):
  74. {.pragma: dirty.}
  75. when not defined(nimHasCursor):
  76. {.pragma: cursor.}
  77. type
  78. DoublyLinkedNodeObj*[T] = object ## \
  79. ## A node a doubly linked list consists of.
  80. ##
  81. ## It consists of a `value` field, and pointers to `next` and `prev`.
  82. next*: <//>(ref DoublyLinkedNodeObj[T])
  83. prev* {.cursor.}: ref DoublyLinkedNodeObj[T]
  84. value*: T
  85. DoublyLinkedNode*[T] = ref DoublyLinkedNodeObj[T]
  86. SinglyLinkedNodeObj*[T] = object ## \
  87. ## A node a singly linked list consists of.
  88. ##
  89. ## It consists of a `value` field, and a pointer to `next`.
  90. next*: <//>(ref SinglyLinkedNodeObj[T])
  91. value*: T
  92. SinglyLinkedNode*[T] = ref SinglyLinkedNodeObj[T]
  93. SinglyLinkedList*[T] = object ## \
  94. ## A singly linked list.
  95. ##
  96. ## Use `initSinglyLinkedList proc <#initSinglyLinkedList>`_ to create
  97. ## a new empty list.
  98. head*: <//>(SinglyLinkedNode[T])
  99. tail* {.cursor.}: SinglyLinkedNode[T]
  100. DoublyLinkedList*[T] = object ## \
  101. ## A doubly linked list.
  102. ##
  103. ## Use `initDoublyLinkedList proc <#initDoublyLinkedList>`_ to create
  104. ## a new empty list.
  105. head*: <//>(DoublyLinkedNode[T])
  106. tail* {.cursor.}: DoublyLinkedNode[T]
  107. SinglyLinkedRing*[T] = object ## \
  108. ## A singly linked ring.
  109. ##
  110. ## Use `initSinglyLinkedRing proc <#initSinglyLinkedRing>`_ to create
  111. ## a new empty ring.
  112. head*: <//>(SinglyLinkedNode[T])
  113. tail* {.cursor.}: SinglyLinkedNode[T]
  114. DoublyLinkedRing*[T] = object ## \
  115. ## A doubly linked ring.
  116. ##
  117. ## Use `initDoublyLinkedRing proc <#initDoublyLinkedRing>`_ to create
  118. ## a new empty ring.
  119. head*: DoublyLinkedNode[T]
  120. SomeLinkedList*[T] = SinglyLinkedList[T] | DoublyLinkedList[T]
  121. SomeLinkedRing*[T] = SinglyLinkedRing[T] | DoublyLinkedRing[T]
  122. SomeLinkedCollection*[T] = SomeLinkedList[T] | SomeLinkedRing[T]
  123. SomeLinkedNode*[T] = SinglyLinkedNode[T] | DoublyLinkedNode[T]
  124. proc initSinglyLinkedList*[T](): SinglyLinkedList[T] =
  125. ## Creates a new singly linked list that is empty.
  126. runnableExamples:
  127. var a = initSinglyLinkedList[int]()
  128. discard
  129. proc initDoublyLinkedList*[T](): DoublyLinkedList[T] =
  130. ## Creates a new doubly linked list that is empty.
  131. runnableExamples:
  132. var a = initDoublyLinkedList[int]()
  133. discard
  134. proc initSinglyLinkedRing*[T](): SinglyLinkedRing[T] =
  135. ## Creates a new singly linked ring that is empty.
  136. runnableExamples:
  137. var a = initSinglyLinkedRing[int]()
  138. discard
  139. proc initDoublyLinkedRing*[T](): DoublyLinkedRing[T] =
  140. ## Creates a new doubly linked ring that is empty.
  141. runnableExamples:
  142. var a = initDoublyLinkedRing[int]()
  143. discard
  144. proc newDoublyLinkedNode*[T](value: T): <//>(DoublyLinkedNode[T]) =
  145. ## Creates a new doubly linked node with the given `value`.
  146. runnableExamples:
  147. var n = newDoublyLinkedNode[int](5)
  148. assert n.value == 5
  149. new(result)
  150. result.value = value
  151. proc newSinglyLinkedNode*[T](value: T): <//>(SinglyLinkedNode[T]) =
  152. ## Creates a new singly linked node with the given `value`.
  153. runnableExamples:
  154. var n = newSinglyLinkedNode[int](5)
  155. assert n.value == 5
  156. new(result)
  157. result.value = value
  158. template itemsListImpl() {.dirty.} =
  159. var it = L.head
  160. while it != nil:
  161. yield it.value
  162. it = it.next
  163. template itemsRingImpl() {.dirty.} =
  164. var it = L.head
  165. if it != nil:
  166. while true:
  167. yield it.value
  168. it = it.next
  169. if it == L.head: break
  170. iterator items*[T](L: SomeLinkedList[T]): T =
  171. ## Yields every value of `L`.
  172. ##
  173. ## See also:
  174. ## * `mitems iterator <#mitems.i,SomeLinkedList[T]>`_
  175. ## * `nodes iterator <#nodes.i,SomeLinkedList[T]>`_
  176. ##
  177. ## **Examples:**
  178. ##
  179. ## .. code-block::
  180. ## var a = initSinglyLinkedList[int]()
  181. ## for i in 1 .. 3:
  182. ## a.append(10*i)
  183. ##
  184. ## for x in a: # the same as: for x in items(a):
  185. ## echo x
  186. ##
  187. ## # 10
  188. ## # 20
  189. ## # 30
  190. itemsListImpl()
  191. iterator items*[T](L: SomeLinkedRing[T]): T =
  192. ## Yields every value of `L`.
  193. ##
  194. ## See also:
  195. ## * `mitems iterator <#mitems.i,SomeLinkedRing[T]>`_
  196. ## * `nodes iterator <#nodes.i,SomeLinkedRing[T]>`_
  197. ##
  198. ## **Examples:**
  199. ##
  200. ## .. code-block::
  201. ## var a = initSinglyLinkedRing[int]()
  202. ## for i in 1 .. 3:
  203. ## a.append(10*i)
  204. ##
  205. ## for x in a: # the same as: for x in items(a):
  206. ## echo x
  207. ##
  208. ## # 10
  209. ## # 20
  210. ## # 30
  211. itemsRingImpl()
  212. iterator mitems*[T](L: var SomeLinkedList[T]): var T =
  213. ## Yields every value of `L` so that you can modify it.
  214. ##
  215. ## See also:
  216. ## * `items iterator <#items.i,SomeLinkedList[T]>`_
  217. ## * `nodes iterator <#nodes.i,SomeLinkedList[T]>`_
  218. runnableExamples:
  219. var a = initSinglyLinkedList[int]()
  220. for i in 1 .. 5:
  221. a.append(10*i)
  222. assert $a == "[10, 20, 30, 40, 50]"
  223. for x in mitems(a):
  224. x = 5*x - 1
  225. assert $a == "[49, 99, 149, 199, 249]"
  226. itemsListImpl()
  227. iterator mitems*[T](L: var SomeLinkedRing[T]): var T =
  228. ## Yields every value of `L` so that you can modify it.
  229. ##
  230. ## See also:
  231. ## * `items iterator <#items.i,SomeLinkedRing[T]>`_
  232. ## * `nodes iterator <#nodes.i,SomeLinkedRing[T]>`_
  233. runnableExamples:
  234. var a = initSinglyLinkedRing[int]()
  235. for i in 1 .. 5:
  236. a.append(10*i)
  237. assert $a == "[10, 20, 30, 40, 50]"
  238. for x in mitems(a):
  239. x = 5*x - 1
  240. assert $a == "[49, 99, 149, 199, 249]"
  241. itemsRingImpl()
  242. iterator nodes*[T](L: SomeLinkedList[T]): SomeLinkedNode[T] =
  243. ## Iterates over every node of `x`. Removing the current node from the
  244. ## list during traversal is supported.
  245. ##
  246. ## See also:
  247. ## * `items iterator <#items.i,SomeLinkedList[T]>`_
  248. ## * `mitems iterator <#mitems.i,SomeLinkedList[T]>`_
  249. runnableExamples:
  250. var a = initDoublyLinkedList[int]()
  251. for i in 1 .. 5:
  252. a.append(10*i)
  253. assert $a == "[10, 20, 30, 40, 50]"
  254. for x in nodes(a):
  255. if x.value == 30:
  256. a.remove(x)
  257. else:
  258. x.value = 5*x.value - 1
  259. assert $a == "[49, 99, 199, 249]"
  260. var it = L.head
  261. while it != nil:
  262. var nxt = it.next
  263. yield it
  264. it = nxt
  265. iterator nodes*[T](L: SomeLinkedRing[T]): SomeLinkedNode[T] =
  266. ## Iterates over every node of `x`. Removing the current node from the
  267. ## list during traversal is supported.
  268. ##
  269. ## See also:
  270. ## * `items iterator <#items.i,SomeLinkedRing[T]>`_
  271. ## * `mitems iterator <#mitems.i,SomeLinkedRing[T]>`_
  272. runnableExamples:
  273. var a = initDoublyLinkedRing[int]()
  274. for i in 1 .. 5:
  275. a.append(10*i)
  276. assert $a == "[10, 20, 30, 40, 50]"
  277. for x in nodes(a):
  278. if x.value == 30:
  279. a.remove(x)
  280. else:
  281. x.value = 5*x.value - 1
  282. assert $a == "[49, 99, 199, 249]"
  283. var it = L.head
  284. if it != nil:
  285. while true:
  286. var nxt = it.next
  287. yield it
  288. it = nxt
  289. if it == L.head: break
  290. proc `$`*[T](L: SomeLinkedCollection[T]): string =
  291. ## Turns a list into its string representation for logging and printing.
  292. result = "["
  293. for x in nodes(L):
  294. if result.len > 1: result.add(", ")
  295. result.addQuoted(x.value)
  296. result.add("]")
  297. proc find*[T](L: SomeLinkedCollection[T], value: T): SomeLinkedNode[T] =
  298. ## Searches in the list for a value. Returns `nil` if the value does not
  299. ## exist.
  300. ##
  301. ## See also:
  302. ## * `contains proc <#contains,SomeLinkedCollection[T],T>`_
  303. runnableExamples:
  304. var a = initSinglyLinkedList[int]()
  305. a.append(9)
  306. a.append(8)
  307. assert a.find(9).value == 9
  308. assert a.find(1) == nil
  309. for x in nodes(L):
  310. if x.value == value: return x
  311. proc contains*[T](L: SomeLinkedCollection[T], value: T): bool {.inline.} =
  312. ## Searches in the list for a value. Returns `false` if the value does not
  313. ## exist, `true` otherwise.
  314. ##
  315. ## See also:
  316. ## * `find proc <#find,SomeLinkedCollection[T],T>`_
  317. runnableExamples:
  318. var a = initSinglyLinkedList[int]()
  319. a.append(9)
  320. a.append(8)
  321. assert a.contains(9)
  322. assert 8 in a
  323. assert(not a.contains(1))
  324. assert 2 notin a
  325. result = find(L, value) != nil
  326. proc append*[T](L: var SinglyLinkedList[T],
  327. n: SinglyLinkedNode[T]) {.inline.} =
  328. ## Appends (adds to the end) a node `n` to `L`. Efficiency: O(1).
  329. ##
  330. ## See also:
  331. ## * `append proc <#append,SinglyLinkedList[T],T>`_ for appending a value
  332. ## * `prepend proc <#prepend,SinglyLinkedList[T],SinglyLinkedNode[T]>`_
  333. ## for prepending a node
  334. ## * `prepend proc <#prepend,SinglyLinkedList[T],T>`_ for prepending a value
  335. runnableExamples:
  336. var
  337. a = initSinglyLinkedList[int]()
  338. n = newSinglyLinkedNode[int](9)
  339. a.append(n)
  340. assert a.contains(9)
  341. n.next = nil
  342. if L.tail != nil:
  343. assert(L.tail.next == nil)
  344. L.tail.next = n
  345. L.tail = n
  346. if L.head == nil: L.head = n
  347. proc append*[T](L: var SinglyLinkedList[T], value: T) {.inline.} =
  348. ## Appends (adds to the end) a value to `L`. Efficiency: O(1).
  349. ##
  350. ## See also:
  351. ## * `append proc <#append,SinglyLinkedList[T],T>`_ for appending a value
  352. ## * `prepend proc <#prepend,SinglyLinkedList[T],SinglyLinkedNode[T]>`_
  353. ## for prepending a node
  354. ## * `prepend proc <#prepend,SinglyLinkedList[T],T>`_ for prepending a value
  355. runnableExamples:
  356. var a = initSinglyLinkedList[int]()
  357. a.append(9)
  358. a.append(8)
  359. assert a.contains(9)
  360. append(L, newSinglyLinkedNode(value))
  361. proc prepend*[T](L: var SinglyLinkedList[T],
  362. n: SinglyLinkedNode[T]) {.inline.} =
  363. ## Prepends (adds to the beginning) a node to `L`. Efficiency: O(1).
  364. ##
  365. ## See also:
  366. ## * `append proc <#append,SinglyLinkedList[T],SinglyLinkedNode[T]>`_
  367. ## for appending a node
  368. ## * `append proc <#append,SinglyLinkedList[T],T>`_ for appending a value
  369. ## * `prepend proc <#prepend,SinglyLinkedList[T],T>`_ for prepending a value
  370. runnableExamples:
  371. var
  372. a = initSinglyLinkedList[int]()
  373. n = newSinglyLinkedNode[int](9)
  374. a.prepend(n)
  375. assert a.contains(9)
  376. n.next = L.head
  377. L.head = n
  378. if L.tail == nil: L.tail = n
  379. proc prepend*[T](L: var SinglyLinkedList[T], value: T) {.inline.} =
  380. ## Prepends (adds to the beginning) a node to `L`. Efficiency: O(1).
  381. ##
  382. ## See also:
  383. ## * `append proc <#append,SinglyLinkedList[T],SinglyLinkedNode[T]>`_
  384. ## for appending a node
  385. ## * `append proc <#append,SinglyLinkedList[T],T>`_ for appending a value
  386. ## * `prepend proc <#prepend,SinglyLinkedList[T],SinglyLinkedNode[T]>`_
  387. ## for prepending a node
  388. runnableExamples:
  389. var a = initSinglyLinkedList[int]()
  390. a.prepend(9)
  391. a.prepend(8)
  392. assert a.contains(9)
  393. prepend(L, newSinglyLinkedNode(value))
  394. proc append*[T](L: var DoublyLinkedList[T], n: DoublyLinkedNode[T]) =
  395. ## Appends (adds to the end) a node `n` to `L`. Efficiency: O(1).
  396. ##
  397. ## See also:
  398. ## * `append proc <#append,DoublyLinkedList[T],T>`_ for appending a value
  399. ## * `prepend proc <#prepend,DoublyLinkedList[T],DoublyLinkedNode[T]>`_
  400. ## for prepending a node
  401. ## * `prepend proc <#prepend,DoublyLinkedList[T],T>`_ for prepending a value
  402. ## * `remove proc <#remove,DoublyLinkedList[T],DoublyLinkedNode[T]>`_
  403. ## for removing a node
  404. runnableExamples:
  405. var
  406. a = initDoublyLinkedList[int]()
  407. n = newDoublyLinkedNode[int](9)
  408. a.append(n)
  409. assert a.contains(9)
  410. n.next = nil
  411. n.prev = L.tail
  412. if L.tail != nil:
  413. assert(L.tail.next == nil)
  414. L.tail.next = n
  415. L.tail = n
  416. if L.head == nil: L.head = n
  417. proc append*[T](L: var DoublyLinkedList[T], value: T) =
  418. ## Appends (adds to the end) a value to `L`. Efficiency: O(1).
  419. ##
  420. ## See also:
  421. ## * `append proc <#append,DoublyLinkedList[T],DoublyLinkedNode[T]>`_
  422. ## for appending a node
  423. ## * `prepend proc <#prepend,DoublyLinkedList[T],DoublyLinkedNode[T]>`_
  424. ## for prepending a node
  425. ## * `prepend proc <#prepend,DoublyLinkedList[T],T>`_ for prepending a value
  426. ## * `remove proc <#remove,DoublyLinkedList[T],DoublyLinkedNode[T]>`_
  427. ## for removing a node
  428. runnableExamples:
  429. var a = initDoublyLinkedList[int]()
  430. a.append(9)
  431. a.append(8)
  432. assert a.contains(9)
  433. append(L, newDoublyLinkedNode(value))
  434. proc prepend*[T](L: var DoublyLinkedList[T], n: DoublyLinkedNode[T]) =
  435. ## Prepends (adds to the beginning) a node `n` to `L`. Efficiency: O(1).
  436. ##
  437. ## See also:
  438. ## * `append proc <#append,DoublyLinkedList[T],DoublyLinkedNode[T]>`_
  439. ## for appending a node
  440. ## * `append proc <#append,DoublyLinkedList[T],T>`_ for appending a value
  441. ## * `prepend proc <#prepend,DoublyLinkedList[T],T>`_ for prepending a value
  442. ## * `remove proc <#remove,DoublyLinkedList[T],DoublyLinkedNode[T]>`_
  443. ## for removing a node
  444. runnableExamples:
  445. var
  446. a = initDoublyLinkedList[int]()
  447. n = newDoublyLinkedNode[int](9)
  448. a.prepend(n)
  449. assert a.contains(9)
  450. n.prev = nil
  451. n.next = L.head
  452. if L.head != nil:
  453. assert(L.head.prev == nil)
  454. L.head.prev = n
  455. L.head = n
  456. if L.tail == nil: L.tail = n
  457. proc prepend*[T](L: var DoublyLinkedList[T], value: T) =
  458. ## Prepends (adds to the beginning) a value to `L`. Efficiency: O(1).
  459. ##
  460. ## See also:
  461. ## * `append proc <#append,DoublyLinkedList[T],DoublyLinkedNode[T]>`_
  462. ## for appending a node
  463. ## * `append proc <#append,DoublyLinkedList[T],T>`_ for appending a value
  464. ## * `prepend proc <#prepend,DoublyLinkedList[T],DoublyLinkedNode[T]>`_
  465. ## for prepending a node
  466. ## * `remove proc <#remove,DoublyLinkedList[T],DoublyLinkedNode[T]>`_
  467. ## for removing a node
  468. runnableExamples:
  469. var a = initDoublyLinkedList[int]()
  470. a.prepend(9)
  471. a.prepend(8)
  472. assert a.contains(9)
  473. prepend(L, newDoublyLinkedNode(value))
  474. proc remove*[T](L: var DoublyLinkedList[T], n: DoublyLinkedNode[T]) =
  475. ## Removes a node `n` from `L`. Efficiency: O(1).
  476. runnableExamples:
  477. var
  478. a = initDoublyLinkedList[int]()
  479. n = newDoublyLinkedNode[int](5)
  480. a.append(n)
  481. assert 5 in a
  482. a.remove(n)
  483. assert 5 notin a
  484. if n == L.tail: L.tail = n.prev
  485. if n == L.head: L.head = n.next
  486. if n.next != nil: n.next.prev = n.prev
  487. if n.prev != nil: n.prev.next = n.next
  488. proc append*[T](L: var SinglyLinkedRing[T], n: SinglyLinkedNode[T]) =
  489. ## Appends (adds to the end) a node `n` to `L`. Efficiency: O(1).
  490. ##
  491. ## See also:
  492. ## * `append proc <#append,SinglyLinkedRing[T],T>`_ for appending a value
  493. ## * `prepend proc <#prepend,SinglyLinkedRing[T],SinglyLinkedNode[T]>`_
  494. ## for prepending a node
  495. ## * `prepend proc <#prepend,SinglyLinkedRing[T],T>`_ for prepending a value
  496. runnableExamples:
  497. var
  498. a = initSinglyLinkedRing[int]()
  499. n = newSinglyLinkedNode[int](9)
  500. a.append(n)
  501. assert a.contains(9)
  502. if L.head != nil:
  503. n.next = L.head
  504. assert(L.tail != nil)
  505. L.tail.next = n
  506. L.tail = n
  507. else:
  508. n.next = n
  509. L.head = n
  510. L.tail = n
  511. proc append*[T](L: var SinglyLinkedRing[T], value: T) =
  512. ## Appends (adds to the end) a value to `L`. Efficiency: O(1).
  513. ##
  514. ## See also:
  515. ## * `append proc <#append,SinglyLinkedRing[T],SinglyLinkedNode[T]>`_
  516. ## for appending a node
  517. ## * `prepend proc <#prepend,SinglyLinkedRing[T],SinglyLinkedNode[T]>`_
  518. ## for prepending a node
  519. ## * `prepend proc <#prepend,SinglyLinkedRing[T],T>`_ for prepending a value
  520. runnableExamples:
  521. var a = initSinglyLinkedRing[int]()
  522. a.append(9)
  523. a.append(8)
  524. assert a.contains(9)
  525. append(L, newSinglyLinkedNode(value))
  526. proc prepend*[T](L: var SinglyLinkedRing[T], n: SinglyLinkedNode[T]) =
  527. ## Prepends (adds to the beginning) a node `n` to `L`. Efficiency: O(1).
  528. ##
  529. ## See also:
  530. ## * `append proc <#append,SinglyLinkedRing[T],SinglyLinkedNode[T]>`_
  531. ## for appending a node
  532. ## * `append proc <#append,SinglyLinkedRing[T],T>`_ for appending a value
  533. ## * `prepend proc <#prepend,SinglyLinkedRing[T],T>`_ for prepending a value
  534. runnableExamples:
  535. var
  536. a = initSinglyLinkedRing[int]()
  537. n = newSinglyLinkedNode[int](9)
  538. a.prepend(n)
  539. assert a.contains(9)
  540. if L.head != nil:
  541. n.next = L.head
  542. assert(L.tail != nil)
  543. L.tail.next = n
  544. else:
  545. n.next = n
  546. L.tail = n
  547. L.head = n
  548. proc prepend*[T](L: var SinglyLinkedRing[T], value: T) =
  549. ## Prepends (adds to the beginning) a value to `L`. Efficiency: O(1).
  550. ##
  551. ## See also:
  552. ## * `append proc <#append,SinglyLinkedRing[T],SinglyLinkedNode[T]>`_
  553. ## for appending a node
  554. ## * `append proc <#append,SinglyLinkedRing[T],T>`_ for appending a value
  555. ## * `prepend proc <#prepend,SinglyLinkedRing[T],SinglyLinkedNode[T]>`_
  556. ## for prepending a node
  557. runnableExamples:
  558. var a = initSinglyLinkedRing[int]()
  559. a.prepend(9)
  560. a.prepend(8)
  561. assert a.contains(9)
  562. prepend(L, newSinglyLinkedNode(value))
  563. proc append*[T](L: var DoublyLinkedRing[T], n: DoublyLinkedNode[T]) =
  564. ## Appends (adds to the end) a node `n` to `L`. Efficiency: O(1).
  565. ##
  566. ## See also:
  567. ## * `append proc <#append,DoublyLinkedRing[T],T>`_ for appending a value
  568. ## * `prepend proc <#prepend,DoublyLinkedRing[T],DoublyLinkedNode[T]>`_
  569. ## for prepending a node
  570. ## * `prepend proc <#prepend,DoublyLinkedRing[T],T>`_ for prepending a value
  571. ## * `remove proc <#remove,DoublyLinkedRing[T],DoublyLinkedNode[T]>`_
  572. ## for removing a node
  573. runnableExamples:
  574. var
  575. a = initDoublyLinkedRing[int]()
  576. n = newDoublyLinkedNode[int](9)
  577. a.append(n)
  578. assert a.contains(9)
  579. if L.head != nil:
  580. n.next = L.head
  581. n.prev = L.head.prev
  582. L.head.prev.next = n
  583. L.head.prev = n
  584. else:
  585. n.prev = n
  586. n.next = n
  587. L.head = n
  588. proc append*[T](L: var DoublyLinkedRing[T], value: T) =
  589. ## Appends (adds to the end) a value to `L`. Efficiency: O(1).
  590. ##
  591. ## See also:
  592. ## * `append proc <#append,DoublyLinkedRing[T],DoublyLinkedNode[T]>`_
  593. ## for appending a node
  594. ## * `prepend proc <#prepend,DoublyLinkedRing[T],DoublyLinkedNode[T]>`_
  595. ## for prepending a node
  596. ## * `prepend proc <#prepend,DoublyLinkedRing[T],T>`_ for prepending a value
  597. ## * `remove proc <#remove,DoublyLinkedRing[T],DoublyLinkedNode[T]>`_
  598. ## for removing a node
  599. runnableExamples:
  600. var a = initDoublyLinkedRing[int]()
  601. a.append(9)
  602. a.append(8)
  603. assert a.contains(9)
  604. append(L, newDoublyLinkedNode(value))
  605. proc prepend*[T](L: var DoublyLinkedRing[T], n: DoublyLinkedNode[T]) =
  606. ## Prepends (adds to the beginning) a node `n` to `L`. Efficiency: O(1).
  607. ##
  608. ## See also:
  609. ## * `append proc <#append,DoublyLinkedRing[T],DoublyLinkedNode[T]>`_
  610. ## for appending a node
  611. ## * `append proc <#append,DoublyLinkedRing[T],T>`_ for appending a value
  612. ## * `prepend proc <#prepend,DoublyLinkedRing[T],T>`_ for prepending a value
  613. ## * `remove proc <#remove,DoublyLinkedRing[T],DoublyLinkedNode[T]>`_
  614. ## for removing a node
  615. runnableExamples:
  616. var
  617. a = initDoublyLinkedRing[int]()
  618. n = newDoublyLinkedNode[int](9)
  619. a.prepend(n)
  620. assert a.contains(9)
  621. if L.head != nil:
  622. n.next = L.head
  623. n.prev = L.head.prev
  624. L.head.prev.next = n
  625. L.head.prev = n
  626. else:
  627. n.prev = n
  628. n.next = n
  629. L.head = n
  630. proc prepend*[T](L: var DoublyLinkedRing[T], value: T) =
  631. ## Prepends (adds to the beginning) a value to `L`. Efficiency: O(1).
  632. ##
  633. ## See also:
  634. ## * `append proc <#append,DoublyLinkedRing[T],DoublyLinkedNode[T]>`_
  635. ## for appending a node
  636. ## * `append proc <#append,DoublyLinkedRing[T],T>`_ for appending a value
  637. ## * `prepend proc <#prepend,DoublyLinkedRing[T],DoublyLinkedNode[T]>`_
  638. ## for prepending a node
  639. ## * `remove proc <#remove,DoublyLinkedRing[T],DoublyLinkedNode[T]>`_
  640. ## for removing a node
  641. runnableExamples:
  642. var a = initDoublyLinkedRing[int]()
  643. a.prepend(9)
  644. a.prepend(8)
  645. assert a.contains(9)
  646. prepend(L, newDoublyLinkedNode(value))
  647. proc remove*[T](L: var DoublyLinkedRing[T], n: DoublyLinkedNode[T]) =
  648. ## Removes `n` from `L`. Efficiency: O(1).
  649. runnableExamples:
  650. var
  651. a = initDoublyLinkedRing[int]()
  652. n = newDoublyLinkedNode[int](5)
  653. a.append(n)
  654. assert 5 in a
  655. a.remove(n)
  656. assert 5 notin a
  657. n.next.prev = n.prev
  658. n.prev.next = n.next
  659. if n == L.head:
  660. var p = L.head.prev
  661. if p == L.head:
  662. # only one element left:
  663. L.head = nil
  664. else:
  665. L.head = L.head.prev