An iterative version based on Gile's code:
(defun PointGroup ( l / a r x x1 x2 )
(while (setq x (car l)) (setq l (cdr l))
(while
(cond
( (setq a (assoc (setq x1 (car x)) l))
(setq x (append (reverse a) (cdr x)) l (vl-remove a l))
)
( (setq a (assoc (setq x2 (last x)) l))
(setq x (append x (cdr a)) l (vl-remove a l))
)
( (setq a (assoc x1 (setq l (mapcar 'reverse l))))
(setq x (append (reverse a) (cdr x)) l (vl-remove a l))
)
( (setq a (assoc x2 l))
(setq x (append x (cdr a)) l (vl-remove a l))
)
)
)
(setq r (cons x r))
)
)