Swapping elements in a Common Lisp list

谁说我不能喝 提交于 2019-11-29 03:47:36

You can use rotatef:

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

Of course, list indexing can be expensive (costing O(size of list)), so if you do this with any regularity, you'd rather want to use an array:

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

I would avoid indexing into the list twice by using nthcdr to get the cdr of the cons cell containing the first element that you want to swap and then use elt to get the remaining element out of the sublist. This means that you only have to actually index starting from the head of the list once.

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

At least from my perspective, this is sufficiently tedious to justify a function.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!