已知待删除节点指针,如何调整单链表大小并完成删除操作?
删除单链表中已知节点(无前置节点指针)的解决方案
当你只能拿到要删除的节点指针(这里是索引2的节点),却无法直接获取它的前驱节点(索引1的节点)时,不需要从头遍历链表找前驱,用节点值覆盖法就能解决,步骤如下:
- 先获取目标节点:
node = f() - 将目标节点的值替换为它后继节点(索引3的节点)的值
- 让目标节点的
next指针直接指向后继节点的下一个节点(索引4的节点) - 若使用需要手动管理内存的语言(如C/C++),记得释放原来的后继节点内存
原理说明
这种方法相当于把后继节点的内容“迁移”到要删除的节点位置,然后删除原来的后继节点,最终效果和直接删除目标节点完全一致,完美避开了找不到前驱的问题。
代码示例
C++ 实现
struct ListNode { int val; ListNode *next; ListNode(int x) : val(x), next(NULL) {} }; // 题目给定的函数,返回索引2的节点指针 ListNode* f() { /* 实现略 */ } void deleteTargetNode() { ListNode* node = f(); // 覆盖当前节点的值 node->val = node->next->val; // 暂存后继节点,用于后续释放内存 ListNode* temp = node->next; // 跳过原后继节点 node->next = node->next->next; // 释放内存(C++必须手动处理) delete temp; }
Python 实现
class ListNode: def __init__(self, val=0, next=None): self.val = val self.next = next # 题目给定的函数,返回索引2的节点指针 def f(): # 实现略 pass def delete_target_node(): node = f() # 覆盖当前节点的值 node.val = node.next.val # 跳过原后继节点 node.next = node.next.next
注意事项
这个方法仅适用于非尾节点的删除操作。如果要删除的是链表最后一个节点,还是需要从头遍历找到它的前驱节点,但你的场景中目标节点是索引2,显然不是尾节点,所以完全适用。
内容的提问来源于stack exchange,提问作者Parth Gupta
相关产品推荐
相关产品推荐

