当前位置: 面试刷题>> 在O(1)时间复杂度删除链表节点 (经典算法题500道)


### 题目描述 给定一个单向链表的节点`p`,但是**不是头节点**,并且保证链表中**确实存在该节点**,要求在**O(1)时间复杂度**内删除该节点`p`。你**不能直接访问链表的头节点**,只能访问和修改节点`p`及其后继节点(如果存在)。 ### 解题思路 由于题目要求在O(1)时间复杂度内删除节点,且不能直接访问头节点,一个常见的技巧是将要删除的节点`p`的下一个节点的值复制到`p`中,然后删除`p`的下一个节点(即将`p`的`next`指针指向`p->next->next`),从而达到“删除”`p`的效果。注意,这种方法仅适用于非尾节点的情况,因为尾节点没有后继节点。但题目已保证`p`不是头节点,并且链表中确实存在该节点,所以这里不考虑尾节点的情况。 ### 示例代码 #### PHP ```php class ListNode { public $val; public $next; function __construct($val = 0, $next = null) { $this->val = $val; $this->next = $next; } } function deleteNode($p) { // 假设p不是尾节点 $p->val = $p->next->val; $p->next = $p->next->next; } ``` #### Python ```python class ListNode: def __init__(self, val=0, next=None): self.val = val self.next = next def deleteNode(p): # 假设p不是尾节点 p.val = p.next.val p.next = p.next.next ``` #### JavaScript ```javascript class ListNode { constructor(val = 0, next = null) { this.val = val; this.next = next; } } function deleteNode(p) { // 假设p不是尾节点 p.val = p.next.val; p.next = p.next.next; } ``` ### 码小课 码小课网站中有更多关于链表操作、算法设计、数据结构等相关内容分享给大家学习,涵盖从基础到进阶的各类知识点,帮助大家深入理解并掌握编程的核心技能。通过丰富的示例和详细的解析,让你在编程的道路上越走越远。
推荐面试题