【问题标题】:Add or remove element in the middle of list (Scheme)在列表中间添加或删除元素(方案)
【发布时间】:2015-03-25 19:52:30
【问题描述】:

是否可以在Scheme的链表中间添加或删除元素?我似乎想不出用 car/cdr/cons 做到这一点的方法,但我认为一定有办法做到这一点。

如果我有一个列表 '(1 3 5 6),例如,我需要在 5 和 6 之间输入 4,这可行吗?

【问题讨论】:

    标签: list scheme r5rs


    【解决方案1】:

    在给定位置添加元素是在previous answer 中完成的。删除给定位置的元素类似:

    (define (delete-at k lst)
      (cond ((null? lst)
             '())
            ((zero? k)
             (cdr lst))
            (else
             (cons (car lst)
                   (delete-at (sub1 k) (cdr lst))))))
    

    【讨论】:

    • 这会给出一个新列表,还是更改现有列表?
    • @user16655 这(与 Scheme 中的大多数列表过程一样)将返回一个新列表
    【解决方案2】:

    这里有两个版本:

    ; list-insert : value index list -> list
    ;   return list where the ith element is x
    (define (list-insert x i xs)
      (if (= i 0)
          (cons x xs)
          (cons (first xs) (list-insert x (- i 1) (rest xs)))))
    
    (define (list-insert/version2 x i xs)
      (define-values (before after) (split-at xs i))
      (append before (list x) after))
    
    (list-insert/version2 'x 2 '(a b c d))
    (list-insert          'x 2 '(a b c d))
    

    两个版本都会分配一个新列表。对于大型列表,它将变得低效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多