了解添加到链接列表的前面
Understanding adding to Front of a Linked List
假设我有一个这样的列表:
[1]-> [2]-> [3]-> [4]-> [5]->NULL
其中值1为头部,5为尾部。
我遵循此处显示的示例代码:https://codereview.stackexchange.com/questions/29784/reversing-a-linked-list-and-adding-removing-nodes
我不明白的是这一行(在addtoFront函数中)
ptr->value = input;
ptr->next = head; // Point next value to the previous head
head = ptr;
这是我得到的。
ptr->value = input
此行用给定值初始化称为指针的节点
`ptr->next = head;`
这一行将新项目(插入到前面)的下一个指针设置为前一个头部,所以我们有这样的东西:
将[9]插入前面,所以:
[9] (new head points to old head)
[9] -> [1] (9's next pointer points to 1)
我不明白的是这一行:
head = ptr;
阅读这篇文章让我感到困惑,因为我将其解释为将两个节点设置为彼此相等,即 [1] 变为 [9],所以我们有 2 个节点,即 [9]、[9]->[9]->[2]->[3]->[4]->[5]->NULL
但事实显然并非如此。
一旦他们没有箭头符号 ->
,我似乎就迷失在到底发生了什么(对于目前的大多数功能)。任何帮助将不胜感激!
这里的问题是您在考虑具体实例的指针,而不是指向内存位置的实际指针。
在您引用的问题中,head 是指向包含节点实例的内存位置的指针。
代码:
head = ptr
正在更新 head 指向的内存位置,而 head 的原始位置现在包含在 ptr->next 中。
要获取head的实际节点值,需要解引用指针:
*head
因此,例如,给定一个指向内存位置 8 的链表头,其中包含一个值为 'a' 的节点实例,以及一个新输入 'b':
在执行您指向的代码之前:
- 头== 8
- head->value == 'a'
- head->next = NULL;
- ptr == 12 // 这是我选择的从调用 malloc
返回的任意内存位置
- ptr->值=='b'
- ptr->next = NULL;
执行您突出显示的代码块后:
- 头 == 12
- head->value == 'b'
- head->next = 8;
- head->next->value == 'a'
- head->next->next == NULL;
- ptr == 12
- ptr->值=='b'
- ptr->next = NULL;
假设您有一个 linked 列表,如下所示:
H T
[3]->[2]->[1]->NULL
并且我们想在前面(头侧)插入一个元素为4
的节点。首先我们需要在旁边创建一个新节点,指向 ptr
:
ptr H T
[4] [3]->[2]->[1]->NULL
然后我们需要link它到列表的头部:
ptr->next = head
ptr H T
[4]---->[3]->[2]->[1]->NULL
最后但同样重要的是,我们需要更新头指针以指向列表的新开头,因为现在它将指向列表中的第二个元素而不是第一个。 ptr
现在指向列表的新第一个元素。
head = ptr;
ptr
H T
[4]->[3]->[2]->[1]->NULL
很快,插入完成。
详情如下:
你的指针看起来像这样:
head -> next -> next -> next -> tail
ptr->value = input;
现在看起来像这样:
head -> next -> next -> next -> tail -> null
和
ptr -> null
所以此时您基本上有两个列表。
ptr->next = head; // Point next value to the previous head
现在您要附加两个列表:
ptr -> head -> next -> next -> next -> tail -> null
head = ptr;
现在你要确保你所说的 head
指向新块而不是旧块。
head(以前的ptr)->next(以前的head)->next->next->next->tail->null
现在您已将该新值插入列表的前面。
假设我有一个这样的列表:
[1]-> [2]-> [3]-> [4]-> [5]->NULL
其中值1为头部,5为尾部。 我遵循此处显示的示例代码:https://codereview.stackexchange.com/questions/29784/reversing-a-linked-list-and-adding-removing-nodes
我不明白的是这一行(在addtoFront函数中)
ptr->value = input;
ptr->next = head; // Point next value to the previous head
head = ptr;
这是我得到的。
ptr->value = input
此行用给定值初始化称为指针的节点
`ptr->next = head;`
这一行将新项目(插入到前面)的下一个指针设置为前一个头部,所以我们有这样的东西:
将[9]插入前面,所以:
[9] (new head points to old head)
[9] -> [1] (9's next pointer points to 1)
我不明白的是这一行:
head = ptr;
阅读这篇文章让我感到困惑,因为我将其解释为将两个节点设置为彼此相等,即 [1] 变为 [9],所以我们有 2 个节点,即 [9]、[9]->[9]->[2]->[3]->[4]->[5]->NULL
但事实显然并非如此。
一旦他们没有箭头符号 ->
,我似乎就迷失在到底发生了什么(对于目前的大多数功能)。任何帮助将不胜感激!
这里的问题是您在考虑具体实例的指针,而不是指向内存位置的实际指针。
在您引用的问题中,head 是指向包含节点实例的内存位置的指针。
代码:
head = ptr
正在更新 head 指向的内存位置,而 head 的原始位置现在包含在 ptr->next 中。
要获取head的实际节点值,需要解引用指针:
*head
因此,例如,给定一个指向内存位置 8 的链表头,其中包含一个值为 'a' 的节点实例,以及一个新输入 'b':
在执行您指向的代码之前:
- 头== 8
- head->value == 'a'
- head->next = NULL;
- ptr == 12 // 这是我选择的从调用 malloc 返回的任意内存位置
- ptr->值=='b'
- ptr->next = NULL;
执行您突出显示的代码块后:
- 头 == 12
- head->value == 'b'
- head->next = 8;
- head->next->value == 'a'
- head->next->next == NULL;
- ptr == 12
- ptr->值=='b'
- ptr->next = NULL;
假设您有一个 linked 列表,如下所示:
H T
[3]->[2]->[1]->NULL
并且我们想在前面(头侧)插入一个元素为4
的节点。首先我们需要在旁边创建一个新节点,指向 ptr
:
ptr H T
[4] [3]->[2]->[1]->NULL
然后我们需要link它到列表的头部:
ptr->next = head
ptr H T
[4]---->[3]->[2]->[1]->NULL
最后但同样重要的是,我们需要更新头指针以指向列表的新开头,因为现在它将指向列表中的第二个元素而不是第一个。 ptr
现在指向列表的新第一个元素。
head = ptr;
ptr
H T
[4]->[3]->[2]->[1]->NULL
很快,插入完成。
详情如下:
你的指针看起来像这样:
head -> next -> next -> next -> tail
ptr->value = input;
现在看起来像这样:
head -> next -> next -> next -> tail -> null
和
ptr -> null
所以此时您基本上有两个列表。
ptr->next = head; // Point next value to the previous head
现在您要附加两个列表:
ptr -> head -> next -> next -> next -> tail -> null
head = ptr;
现在你要确保你所说的 head
指向新块而不是旧块。
head(以前的ptr)->next(以前的head)->next->next->next->tail->null
现在您已将该新值插入列表的前面。