Anonymous user
Doubly-linked list/Definition: Difference between revisions
Previous implementation was O(n) in time for tail insertion.
(Common Lisp solution) |
(Previous implementation was O(n) in time for tail insertion.) |
||
Line 400:
=={{header|Common Lisp}}==
<lang lisp>(defstruct
(defstruct dlink content prev next)
(defun insert-
"Insert a fresh link containing DATA after existing link BEFORE if not nil and before existing link AFTER if not nil"
"Returns the new head of the list."▼
(let ((new-link (make-
(
(setf (dlist-head dlist) new-link)
(setf (dlist-tail dlist) new-link)
new-link))
(defun
"Insert a fresh link containing DATA before existing link DLINK"
(insert-between dlist (dlink-prev dlink) dlink data))
(defun insert-
"Insert a fresh link containing DATA after existing link DLINK"
(
▲ (unless (null next)
▲ (setf (node-prev next) new))
▲ (setf (node-next node) new)))
(defun insert-
"
(insert-
(defun
"
(insert-between dlist (dlist-tail dlist) nil data))
(defun remove-link (dlist dlink)
"Remove link DLINK from DLIST and return its content"
(let ((before (dlink-prev dlink))
(after (dlink-next dlink)))
(if (null before)
(setf (dlist-head dlist) after)
(setf (dlink-next before) after))
(if (null after)
(setf (dlist-tail dlist) before)
(setf (dlink-prev after) before))))
(defun dlist-elements (dlist)
(labels ((extract-values (dlink acc)
(if (null dlink)
acc
(extract-values (dlink-next dlink) (cons (dlink-content dlink) acc)))))
(reverse (extract-values (dlist-head dlist) nil))))</lang>
The following produces <code>(1 2 3 4)</code>.
<lang lisp>(let
(insert-
(let* ((next-to-last (insert-before dlist (dlist-tail dlist) 3))
(list-elements dl))</lang>▼
(bad-link (insert-before dlist next-to-last 42)))
(remove-link dlist bad-link))
=={{header|Visual Basic .NET}}==
|