On Sat, 21 Jul 2007, Jeff King wrote: > > By which I mean you can keep the 'for' loop, since in either case we are > always reading p->next (if we skip, then we set *pp to p->next anyway, > and if we don't, then pp becomes a pointer to p->next). > > So this is a more readable patch which I believe is equivalent. Fair enough, that also works. Anyway, just because this is actually something I've noticed a lot of people do wrong, I actually do tend to think that when you traverse a singly-linked list and remove entries, you should *never* traverse the list itself, you should only ever traverse the "pointer to the pointer". So the difference between your version and mine is that the while ((p = *pp) != NULL) model really only has one single "iterator variable": "pp". Which makes it a lot easier to think about and avoid problems. In contrast, your for-loop actually keeps track of *two* independent variables, the "tail pointer of the list we're building up" (pp) and the "head pointer of the old list we're traversing" (p). Does it work? Yes. But I tend to prefer the "there's a single list" model, where you just remove entries as you traverse it through a single indirect pointer. They're certainly equivalent, but slightly different mindsets. I at least personally find the "single pointer" less likely to have problems, because you can never get out of sync (which was basically exactly the problem that Junio's code had), because there is nothing to get out of sync _with_ when you just have a single main iterator variable. Linus - To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html