思い付かないので

とりあえず整理だけ。変数名をc[ad]+rにしたのもいけなかったな…

(defun nalist-to-plist (alist)
  (do* ((result (car alist))
        (a alist next)
        (next #1=(cdr a) #1#))
      ((null a) result)
    (let ((1st (car a))
          (2nd a)
          (3rd (cadr a)))
      (setf (car 2nd) (cdr 1st)
            (cdr 2nd) 3rd
            (cdr 1st) 2nd))))

(defun nplist-to-alist (plist)
  (do* ((result (cdr plist))
        (p plist next)
        (next #2=(cddr p) #2#))
      ((null p) result)
    (let ((1st-pair p)
          (1st (cdr p))
          (2nd (cdddr p)))
      (setf (cdr 1st-pair) (car 1st)
            (car 1st) 1st-pair
            (cdr 1st) 2nd))))

破壊的操作を10分で - kozima の日記 - cadr group
逆の付け変え方かな。loopの書き方勉強になる。
リストの破壊的操作をする - 象徴ヶ淵
rotatefとか全く出てこなかった。短かいなー。