相同,但在线性时间内:)
(defun remove-all-but-last (list element)
(reverse
(remove-if
((lambda (x)
#'(lambda (y)
(when (equal y element)
(if x t (not (setf x t)))))) nil)
(reverse list))))
而且,顾名思义,这是一个人为的解决方案,但是 (!) 一次性完成。
(defun remove-all-but-last-contrieved
(list element &optional (test #'equal))
(do ((c list (cdr c))
constructed
back-ref
last
last-seen)
((null c) back-ref)
(if back-ref
(setf last constructed
(cdr constructed) (list (car c))
constructed (cdr constructed))
(setf constructed (list (car c))
back-ref constructed))
(when (funcall test (car c) element)
(if (or last-seen last)
(when last-seen
(rplacd last-seen (cddr last-seen)))
(setf back-ref nil constructed nil))
(setf last-seen last))))