fork download
  1. ; palindrome list
  2.  
  3. (define (reverse! xs)
  4. (let loop ((prev (list)) (curr xs))
  5. (if (null? curr) prev
  6. (let ((next (cdr curr)))
  7. (set-cdr! curr prev)
  8. (loop curr next)))))
  9.  
  10. (define (split xs)
  11. (let loop ((tortoise xs) (hare xs))
  12. (cond ((and (pair? hare) (pair? (cdr hare)))
  13. (loop (cdr tortoise) (cddr hare)))
  14. ((pair? hare) (cdr tortoise))
  15. (else tortoise))))
  16.  
  17. (define (last-pair xs)
  18. (if (null? (cdr xs)) xs (last-pair (cdr xs))))
  19.  
  20. (define (palindrome? xs)
  21. (let ((last (last-pair xs)) (middle (split xs)))
  22. (let loop ((front xs) (back (reverse! middle)))
  23. (cond ((null? back) (set! middle (reverse! last)) #t)
  24. ((= (car front) (car back))
  25. (loop (cdr front) (cdr back)))
  26. (else (set! middle (reverse! last)) #f)))))
  27.  
  28. (define xs '(1 2 3 4 4 3 2 1))
  29. (display (palindrome? xs)) (newline)
  30. (display xs) (newline)
  31.  
  32. (define xs '(1 2 3 4 5 4 3 2 1))
  33. (display (palindrome? xs)) (newline)
  34. (display xs) (newline)
  35.  
  36. (define xs '(1 2 3 4 5 6 7 8))
  37. (display (palindrome? xs)) (newline)
  38. (display xs) (newline)
Success #stdin #stdout 0.02s 50224KB
stdin
Standard input is empty
stdout
#t
(1 2 3 4 4 3 2 1)
#t
(1 2 3 4 5 4 3 2 1)
#f
(1 2 3 4 5 6 7 8)