、已知L是带表头结点的非空单链表,且P结点既不是首元结点,也不是尾元结点,请写出删除P结点的算法
时间: 2023-09-06 12:08:39 浏览: 169
假设P结点是链表中第i个结点,那么我们可以先找到第i-1个结点,然后将其next指针指向第i+1个结点即可完成P结点的删除操作。具体实现如下:
```
void deleteNode(ListNode* head, ListNode* p) {
if (!head || !p) return;
ListNode* prev = head;
while (prev->next && prev->next != p) {
prev = prev->next;
}
if (prev->next == p) {
prev->next = p->next;
delete p;
}
}
```
其中,head是链表的头结点,p是要删除的结点。在函数中,我们首先判断了head和p是否为空,然后从头结点开始遍历链表,找到p结点的前一个结点prev,最后将prev的next指针指向p的下一个结点,然后删除p结点。
相关问题
1、已知L是带表头结点的非空单链表,且P结点既不是首元结点,也不是尾元结 点,请写出删除P结点的算法。
删除P结点的算法步骤如下:
1. 判断链表是否为空,如果为空则直接返回。
2. 遍历链表,找到P结点的前一个结点pre和后一个结点next。
3. 将pre的next指向next,将P结点删除。
4. 释放P结点的内存空间。
算法实现代码如下:
```
void deleteNode(Node* L, Node* P) {
if (L == NULL || P == NULL || L->next == NULL) {
return;
}
Node* pre = L;
Node* cur = L->next;
while (cur != NULL) {
if (cur == P) {
pre->next = cur->next;
free(cur);
break;
}
pre = cur;
cur = cur->next;
}
}
```
其中,L为链表的头结点,P为要删除的结点。注意,这里假设链表有头结点,如果没有头结点,则需要分别考虑删除首元结点和尾元结点的情况。
已知 L是带表头结点的非空单链表(如图下图所示),且P 结点既不是首元结点也不是尾元结点,
请问如何删除结点P?
可以先找到P结点的前驱结点pre,然后将pre的next指针指向P的后继结点next,最后释放P结点的内存即可。具体代码实现如下:
Node* pre = L;
while(pre->next != P) {
pre = pre->next;
}
pre->next = P->next;
free(P);
阅读全文