Doubly-linked list/Definition: Difference between revisions
Content added Content deleted
(Add Python) |
(Common Lisp solution) |
||
Line 397: | Line 397: | ||
} |
} |
||
}</lang> |
}</lang> |
||
=={{header|Common Lisp}}== |
|||
<lang lisp>(defstruct (node (:constructor make-node (element &key prev next))) |
|||
(element nil :type t) |
|||
(prev nil :type (or null node)) |
|||
(next nil :type (or null node))) |
|||
(defun insert-head (element list) |
|||
"Returns the new head of the list." |
|||
(let ((new (make-node element :next list))) |
|||
(setf (node-prev list) new))) |
|||
(defun tail (list) |
|||
"Return the last node of the list." |
|||
(do ((tail list (node-next tail))) |
|||
((null (node-next tail)) tail))) |
|||
(defun insert-middle (element node) |
|||
"Returns the newly created node." |
|||
(let* ((next (node-next node)) |
|||
(new (make-node element :prev node :next next))) |
|||
(unless (null next) |
|||
(setf (node-prev next) new)) |
|||
(setf (node-next node) new))) |
|||
(defun insert-tail (element list) |
|||
"Returns the head of the list." |
|||
(insert-middle element (tail list)) |
|||
list) |
|||
(defun list-elements (list &aux (elements '())) |
|||
"Returns a normal Lisp list of the elements of list." |
|||
(do ((node list (node-next node))) |
|||
((null node) (nreverse elements)) |
|||
(push (node-element node) elements)))</lang> |
|||
The following produces <code>(1 2 3 4)</code>. |
|||
<lang lisp>(let* ((dl (make-node 3)) |
|||
(dl (insert-head 1 dl)) |
|||
(dl (insert-tail 4 dl))) |
|||
(insert-middle 2 dl) |
|||
(list-elements dl))</lang> |
|||
=={{header|Visual Basic .NET}}== |
=={{header|Visual Basic .NET}}== |
||
Line 528: | Line 572: | ||
End Class</lang> |
End Class</lang> |
||
=={{header|D}}== |
=={{header|D}}== |