我经常在 C 中使用线性链表结构
typedef struct _node {
...node guts...
struct _node *next
} node;
和枚举成语
for (node *each = headNode; each != NULL; each = each->next)
我现在处于一种情况,循环列表对我很有吸引力(例如,最后一个节点的下一个节点设置为 headNode)。天真地,我以为我会使用类似于那里的for
表达式的东西,而且我盯着它看的次数越多,我想我已经说服自己你不能用循环链表做这样的事情。
似乎无论我为结束条件想出什么样的表达式,我都会遇到一个基本问题,即我希望所说的条件在第一次遇到相同节点时评估为真,第二次为假。我可以做一些有循环副作用的事情:
for (BOOL traversed = FALSE, node *each = headNode;
traversed && each != headNode;
traversed = TRUE, each = each->next)
但这肯定会失去空终止列表方法的优雅/简单性。这么晚了,有什么逻辑技巧让我无法理解吗?
显然我可以使用 while() 构造,也许这是唯一的方法。