删除链表中的元素

Deleting elements in linked list

这出现在算法和数据结构的旧考试之一中。这看起来很简单,但我需要一些帮助来理解它的工作原理。

目标是仅使用指向头部的指针从单链表中删除某些原子。

原子结构为:

struct at {
 int element;
 struct at *next;
};
typedef struct at atom;

解决方法是:

void delete(atom **head)
{
  while((*head)){
    if((*head)->element%2){ /*just a condition for deleting*/
      (*head)=(*head)->next; /*deleting the atom*/
    } else {
       head= &(*head)->next; 
    }
   }
 }

我的理解是,在这个函数中,“*head”是实际的头部(指向第一个原子的指针),"head" 是指向实际头部的指针。显然,因为我实际上要更改列表的头部和内容,所以我需要传递一个指向头部的指针。

我只是不明白 head= &(*head)->next 是怎么工作的。我试着把它写在纸上,但仍然无法理解。它怎么不改变任何东西,只是跳到下一个原子?

正如你所说,*head 是实际的头(指向第一个原子的指针),head 是指向实际的 head.In 语句的指针 head= &(*head)->next; 我们正在用实际头节点旁边的节点地址更新 head(其中包含实际头的地址)。

现在 head 是一个指针,它存储头地址到下一个节点而不是头节点,即下一个原子。

考虑一个列表 1->2->3->4->5

在这种情况下,最初 head 包含地址节点 1,*head 是节点 1 本身。 现在,当我们说 head= &(*head)->next; 时,它意味着 head 将存储节点 2.If 的地址,我们将 *head 它 return 节点 2.