链表部分遍历是否算作one pass?删除倒数第N个节点解法疑问
关于该解法为何属于one pass的解答
首先明确链表题里one pass、two pass的判定核心:只看你有没有对整个完整链表做超过1次的全量遍历,和代码里写了多少个循环没有任何关系。
我们先看真正的two pass解法是什么样的:
- 第一遍先从头走到尾遍历完整链表,统计出总长度L
- 第二遍再从头走到第L-n的位置,删除对应节点
这种解法每个节点都会被访问2次,总遍历步数是2L,所以才叫two pass。
再看你贴的这段代码,我们算总遍历步数:
假设链表总长度为L:
- 第一个
while(n-->0)循环里h2只走了n步,访问前n个节点 - 后续的h2移动加第二个while循环,h2一共走L-n步,访问剩下的L-n个节点
两个阶段的访问范围完全没有重叠,加起来h2刚好只走完1次完整链表,所有节点最多被访问1次,总步数就是L,当然属于one pass解法。你觉得它像two pass只是因为用了两个循环,但两个循环的遍历范围是前后衔接的,并没有重复走任何一段链表,自然不会被判定为两次遍历。
内容的提问来源于stack exchange,提问作者Flying Potus
相关产品推荐
相关产品推荐

