假定已知链表的某一个中间节点,请实现一种算法, 将该节点从链表中删除。单链表结构体: typedef ElemType int typedef struct ListNode Elem Type va
时间: 2024-12-23 22:14:17 浏览: 18
在单链表中,如果你想删除某个已知的中间节点,可以采用迭代或递归的方式。这里给出一个基于迭代的简单实现,假设链表的每个节点都有一个指向下一个节点的指针`next`,并且我们有一个`ListNode`结构体如下:
```cpp
typedef struct ListNode {
int val; // 节点值
ListNode* next; // 指向下个节点
} ListNode;
```
以下是删除指定中间节点的迭代方法:
```cpp
void deleteMiddleNode(ListNode* &head, ListNode* middle) {
if (middle == nullptr) return; // 如果中间节点不存在或链表为空,直接返回
if (head == middle) { // 如果头节点就是中间节点
head = middle->next; // 更新头节点为中间节点的下一个节点
} else {
ListNode *prev = head; // 初始化前驱指针
while (prev != middle) { // 找到中间节点的前一个节点
prev = prev->next;
middle = middle->next;
}
prev->next = middle->next; // 把中间节点的前一个节点的next指向前一个节点的next
}
}
```
在这个算法中,我们通过一个额外的`prev`指针追踪中间节点的前一个节点。当`middle`到达链表末尾时,说明找到了中间节点,此时`prev`的`next`就是要删除的节点。如果`head`等于`middle`,则说明头节点就是中间节点,直接更新头节点。
阅读全文