了解添加到链接列表的前面

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':

在执行您指向的代码之前:

  1. 头== 8
  2. head->value == 'a'
  3. head->next = NULL;
  4. ptr == 12 // 这是我选择的从调用 malloc
  5. 返回的任意内存位置
  6. ptr->值=='b'
  7. ptr->next = NULL;

执行您突出显示的代码块后:

  1. 头 == 12
  2. head->value == 'b'
  3. head->next = 8;
  4. head->next->value == 'a'
  5. head->next->next == NULL;
  6. ptr == 12
  7. ptr->值=='b'
  8. 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

现在您已将该新值插入列表的前面。