JavaScript单链表删除节点:移除值大于50的节点并优化实现
问题分析与解决方案
你的代码存在两个核心问题:
- 条件判断错误:你写的
currentNode > 50是把Node对象和数字50比较,这永远不会得到正确结果——对象与数字比较会被转换为NaN,条件不成立,循环根本不会执行;就算改成currentNode.data >50,原逻辑也只是跳过开头大于50的节点,没有真正删除所有符合条件的节点。 - 未修改链表结构:你只是移动了
currentNode指针,没有调整链表中节点的next指向,等于没真正删除节点,自然得不到正确的新链表。
正确实现(删除所有值>50的节点)
下面是可以正确删除节点并输出结果的代码,同时优化了链表的构建过程:
class Node { constructor(d) { this.data = d; this.next = null; } } class LinkedList { constructor(head = null) { this.head = head; } // 辅助方法:在链表末尾添加节点,简化构建过程 addNode(data) { const newNode = new Node(data); if (!this.head) { this.head = newNode; return; } let current = this.head; while (current.next) { current = current.next; } current.next = newNode; } // 删除所有值大于50的节点 removeNodesGreaterThan50() { // 先处理头节点:如果头节点值>50,直接替换头节点 while (this.head && this.head.data > 50) { this.head = this.head.next; } if (!this.head) return; // 链表为空,直接返回 let prev = this.head; let current = this.head.next; while (current) { if (current.data > 50) { // 删除当前节点:让前一个节点的next跳过当前节点 prev.next = current.next; } else { // 前一个节点跟进 prev = current; } // 当前节点继续向后遍历 current = current.next; } } // 输出链表所有节点值 printList() { const result = []; let current = this.head; while (current) { result.push(current.data); current = current.next; } console.log(result); return result; } } // 简化链表构建 const list = new LinkedList(); const values = [38,74,87,21,91,98,73,41,29,3,72,94,12,13,16]; values.forEach(val => list.addNode(val)); // 执行删除操作并输出 list.removeNodesGreaterThan50(); list.printList(); // 输出:[38, 21, 41, 29, 3, 12, 13, 16]
关于高效写法的说明
上面的实现就是最优复杂度的写法:
- 时间复杂度:O(n),只需要遍历链表一次(处理头节点+遍历中间节点)
- 空间复杂度:O(1),只用到了几个指针变量,没有额外开辟空间
- 直接在原链表上修改节点指向,不需要创建新链表,是单链表删除节点的标准高效做法
内容的提问来源于stack exchange,提问作者Aquiles Bailo
相关产品推荐
相关产品推荐

