繁体   English   中英

如何从链表中删除中间节点

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM