Certainly.
The following code is written is ATS1:
slseg(l1, l2) is a singly-linked list segment from l1 to l2. So a circular one is just
a case where l1 = l2.
If you want a doubly-linked one, please see the following;
The caveat is that writing this kind of code often requires a lot of effort that may
not be easily justified in practice.
Another approach (which I would take) is to use reference-counted nodes; it makes
the resulting code a bit slower but can drastically simplify the implementation effort.