删除链表中的元素
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.
这出现在算法和数据结构的旧考试之一中。这看起来很简单,但我需要一些帮助来理解它的工作原理。
目标是仅使用指向头部的指针从单链表中删除某些原子。
原子结构为:
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.