Which allocator? Your program happens to have more than one. The caller owns a node? Which caller? There are three iterators moving through your list. Synchronization, hmmm? Is your priority throughput or latency? Is your priority fairness or progress? Only one owner sure makes your linked list a LOT less useful--so much so that you probably want to use a different data structure. If you wish to ignore circularity, you may wish to use a different data structure. Mark and sweep? Oh, apparently you're good with large pauses while you traverse the universe? Well, apparently those people who use incremental garbage collection or generational garbage collectors need to avoid linked lists, eh?
The fact that you think these answers are easy and obvious should give you pause.
Concurrency in non-GC languages is not at all a solved problem. So much so, that "use GC" is often the only acceptable answer.
1. Unless you have a good reason, the default one. 2. call the right allocator/do RAII. 3. The 'borrow checker' doesn't solve concurrency problems. 4. it's not a graph data structure, if you're using normal list operations you won't introduce cycles---concurrency bugs not withstanding (see 3). Not sure why you're hung up on that.
Pretending linked lists are some sort of unsolved computer science problem that necessitates all this pain is quite silly and quite telling.
The fact that you think these answers are easy and obvious should give you pause.
Concurrency in non-GC languages is not at all a solved problem. So much so, that "use GC" is often the only acceptable answer.