【发布时间】:2025-12-27 17:45:11
【问题描述】:
我一直在通过 LeetCode 上的算法挑战,刚刚完成了“从列表末尾删除第 N 个节点”。
许多热门答案声称找到了“一次性”解决方案,我在下面提供了一个 Java 示例。
请有人解释一下为什么“while(n-->0) h2=h2.next;”不计为链表的额外通过,因此,将其设为“两次通过”解决方案?
public ListNode RemoveNthFromEnd(ListNode head, int n) {
ListNode h1=head, h2=head;
while(n-->0) h2=h2.next;
if(h2==null)return head.next; // The head need to be removed, do it.
h2=h2.next;
while(h2!=null){
h1=h1.next;
h2=h2.next;
}
h1.next=h1.next.next; // the one after the h1 need to be removed
return head;
}
我在 cmets 中查看了此解决方案和其他解决方案,但找不到答案。同样,一般的 Google 搜索也没有给出解释。
提前致谢。
【问题讨论】:
-
链接会很好。
-
例如参见this 中的讨论。这是否是“一次通过”似乎是有争议的。
-
我设法在您的第一个答案被删除前不久抓住了它,但它准确地解释了我在寻找什么 - 列表分两部分遍历的事实:第一个循环中的 1 到 n 和第二个列表中的其余部分。谢谢!
-
可能是那些称其为“一次性”解决方案的人实际上意味着它是一个 O(n) 解决方案——这是真的。
标签: java algorithm loops linked-list