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

时间:2014-02-04 05:03:47

标签: c++ algorithm linked-list nodes singly-linked-list

我有一个单独的链表。如果我想从此链表中删除已知元素,我该怎么办?

例如: 节点*头; (44) 节点*尾; (39)

链表:44 27 59 13 45 39 我们想从中删除45。并得到:44 27 59 13 39

我只想到从列表中删除第一个元素(如果元素(需要删除)是列表的第一个元素)。 我得到了:head = head->下;

如何从列表中删除中间节点?

6 个答案:

答案 0 :(得分:1)

13将指向45作为其下一个元素,将其下一个元素简单地更改为39.并将45从内存中释放出来,只是为了防止内存从垃圾中清除。

答案 1 :(得分:1)

此伪代码可能对您有所帮助: -

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;
  }
}

答案 2 :(得分:0)

如果有值,请查看下一个节点中的值。如果这是您要查找的值,则下一个节点是要删除的节点,因此在保留指向下一个节点的指针后,您可以使当前节点的下一个元素指向下一个节点的下一个元素,以便您可以删除它

// 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

答案 3 :(得分:0)

首先,找到要删除的元素。不要忘记在元素不存在时进行处理:

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);

答案 4 :(得分:0)

仔细思考问题。

您需要一个循环来遍历所有节点,直到找到您要查找的节点。假设你有Node * curr,prev都指向head。

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;

然后你可以组装所有这些步骤并编写一个工作程序。

答案 5 :(得分:0)

您只需要首先分析问题,然后知道我们删除特定节点后需要进行的更改。 让我们假设我们有应该删除的节点的地址 如果节点是第一个节点,最后一个节点或中间节点(即最少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);
        }
        
}