; deletion from a cyclical list

(define (last-pair xs)
  (if (null? xs) (error 'last-pair "empty list")
    (if (null? (cdr xs)) xs (last-pair (cdr xs)))))

(define (cycle . xs) (set-cdr! (last-pair xs) xs) xs)

(define (remove-cycle eql? x xs)
  (let loop ((ys (cdr xs)))
    (if (eql? x (car ys)) (remove-head ys)
      (if (eq? xs ys) xs (loop (cdr ys))))))

(define (remove-head xs)
  (let loop ((ys (cdr xs)))
    (cond ((eq? xs (cdr ys))
            (set-cdr! ys (cddr ys)) ys)
          (else (loop (cdr ys))))))

(define xs (cycle 2 3 5 7 11 13 17 19 23 29))
(set! xs (remove-cycle = 2 xs))
(set! xs (remove-cycle = 11 xs))
(set! xs (remove-cycle = 19 xs))
(set! xs (remove-cycle = 21 xs))
(set! xs (remove-cycle = 23 xs))
(display xs) (newline)