Doubly-linked list/Definition: Difference between revisions

Common Lisp solution
(Add Python)
(Common Lisp solution)
Line 397:
}
}</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}}==
Line 528 ⟶ 572:
 
End Class</lang>
 
 
=={{header|D}}==
Anonymous user