当前位置: 面试刷题>> 在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;
}
```
### 码小课
码小课网站中有更多关于链表操作、算法设计、数据结构等相关内容分享给大家学习,涵盖从基础到进阶的各类知识点,帮助大家深入理解并掌握编程的核心技能。通过丰富的示例和详细的解析,让你在编程的道路上越走越远。