[英]How to remove intermediate node from a linked list
我有一个单链表。 如果我想从这个链表中删除一个已知元素,我该怎么做?
例如:节点*头; (44) 节点*尾; (39)
链表:44 27 59 13 45 39 我们想从中删除 45。 并得到:44 27 59 13 39
我只发现从列表中删除第一个元素(如果元素(需要删除)是列表的第一个元素)。 我得到:head = head-> next;
如何从列表中删除中间节点?
13 将指向 45 作为它的下一个元素,简单地将它的下一个元素更改为 39。并从内存中释放 45,只是为了保持内存干净无垃圾。
此伪代码可能对您有所帮助:-
void remove(int key) {
Node* p = head->next;
Node*prev = head;
while(p!=NULL) {
if(p->data==key) {
prev->next = p->next;
free(p);
break;
}
prev = p;
p = p->next;
}
}
查看下一个节点中的值,如果有值。 如果这是您要查找的值,那么下一个节点就是要删除的节点,因此在保留指向下一个节点的指针以便您可以删除之后,您使当前节点的下一个元素指向下一个节点的下一个元素它。
// Assuming head is a non-const reference variable (or a global variable)
if (head == NULL)
return;
if (head->value == wanted)
{
head = head->next;
return;
}
for (Node *curr = head; curr->next != NULL; curr = curr->next)
{
if (curr->next->value == wanted)
{
Node *old = curr->next;
curr->next = curr->next->next;
delete old;
return;
}
}
return; // Possibly after reporting that the value wanted was not found
首先,找到要删除的元素。 当元素不存在时不要忘记处理:
Node* find(Node* head, int value) {
do {
if (head->value == value) return head;
head = head->next;
} while (head);
return nullptr;
}
然后,您想将上一个节点的next
ptr 连接到下一个节点。 在单链表中,您可以使用局部变量跟踪前一个节点。 如果要删除的节点是头(即没有前一个节点),或者如果该节点是尾(即没有下一个节点),请不要忘记处理:
Node *previous = nullptr;
do {
if (head->value == value) {
if (previous != nullptr) {
previous->next = head->next;
}
if (head == tail) {
tail = previous;
}
return;
}
previous = head;
head = head->next;
} while (head);
仔细思考问题。
您需要一个循环来遍历所有节点,直到找到您要查找的节点。 假设您有 Node* curr, prev 都指向头部。
while(curr != null)
对于每个节点,您需要检查该值是否与您要查找的节点匹配。
if (curr->value == node_you_are_looking_for->value)
如果这是匹配节点,则删除该节点。 您有两个指针可以更新链接。
prev->next = curr->next;
prev = curr;
curr = curr->next;
prev->next = null;
delete(prev);
否则继续遍历列表。
prev = curr;
curr= curr->next;
然后你可以组装所有这些步骤并编写一个工作程序。
您只需要先分析问题,并知道如果我们删除特定节点所需的更改。 让我们假设我们有应该被删除的节点的地址,如果节点是第一个节点或最后一个节点或中间节点,即最少 2 个节点,则有 3 种情况。
void deletenode(struct node **s,struct node *t){
struct node *temp;
if(*s==t)
{
*s=t->next;
free(t);
}
else{
temp=*s;
while(temp->next!=t)
{
temp=temp->next;
}
temp->next=t->next;
delete(t);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.