交换Common Lisp列表中的元素

时间:2010-10-16 20:16:53

标签: list lisp common-lisp swap

是否有一个Common Lisp函数会在给定索引的情况下交换列表中的两个元素并返回修改后的列表?

2 个答案:

答案 0 :(得分:17)

您可以使用rotatef

(rotatef (nth i lst) (nth j lst))

当然,列表索引可能很昂贵(花费O(列表的大小)),所以如果你做任何规律性的事情,你宁愿使用数组:

(rotatef (aref arr i) (aref arr j))

答案 1 :(得分:4)

我会避免使用nthcdr两次索引到列表中,以获取包含要交换的第一个元素的cons单元格的cdr,然后使用elt将剩余的元素取出子列表。这意味着你只需要从列表的头部开始实际索引一次。

 (let ((list-tail (nthcdr i list)))
    (rotatef (car list-tail)
             (elt list-tail (- j i)))
    list)

至少从我的角度来看,这对于一个函数来说是非常繁琐的。