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

时间:2015-11-13 17:14:04

标签: c data-structures linked-list nodes

假设我有一个这样的列表:

[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

此行使用给定值

初始化名为pointer的节点
`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

但事实显然并非如此。

一旦他们没有箭头符号->,我似乎迷失了正在发生的事情(对于大多数现有的功能)。任何帮助将不胜感激!

3 个答案:

答案 0 :(得分:0)

这里的问题是你在考虑具体实例的指针,而不是作为内存位置的实际指针。

在您引用的问题中,head是指向包含节点实例的内存位置的指针。

代码:
    head = ptr

正在更新头部指向的内存位置,而头部的原始位置现在包含在ptr-> next中。

要获取head的实际节点值,需要取消引用指针:

*head

因此,例如,给定一个链接列表头指向内存位置8,其中包含一个值为' a'的节点实例,以及一个新输入' b':

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

  1. head == 8
  2. head-> value ==' a'
  3. head-> next = NULL;
  4. ptr == 12 //这是我选择从malloc调用中返回的任意内存位置
  5. ptr-> value ==' b'
  6. ptr-> next = NULL;
  7. 执行突出显示的代码块后:

    1. head == 12
    2. head-> value ==' b'
    3. head-> next = 8;
    4. head-> next-> value ==' a'
    5. head-> next-> next == NULL;
    6. ptr == 12
    7. ptr-> value ==' b'
    8. ptr-> next = NULL;

答案 1 :(得分:0)

我们假设您有一个链接列表,如下所示:

 H         T
[3]->[2]->[1]->NULL

我们想要在前面(头侧)插入一个元素4的节点。首先,我们需要在ptr

指向的旁边创建一个新节点
ptr      H         T
[4]     [3]->[2]->[1]->NULL

然后我们需要将它链接到列表的头部:

ptr->next = head

ptr      H         T
[4]---->[3]->[2]->[1]->NULL

最后但并非最不重要的是,我们需要更新头指针以指向列表的新开头,因为现在它将指向列表中的第二个元素而不是第一个元素。 ptr现在指向列表的新第一个元素。

head = ptr;

ptr
 H              T
[4]->[3]->[2]->[1]->NULL

然后,插入完成。

答案 2 :(得分:0)

以下是详细信息:

你的指针看起来像这样:

头 - >下一个 - >下一个 - >下一个 - >尾

ptr->value = input;

现在看起来像这样:

头 - >下一个 - >下一个 - >下一个 - >尾巴 - >空

ptr - >空

所以你现在基本上有两个清单。

ptr->next = head;  // Point next value to the previous head

现在您要附上两个列表:

ptr - >头 - >下一个 - >下一个 - >下一个 - >尾巴 - >空

head = ptr;

现在你要确保你所谓的head指向新的块而不是旧块。

head(以前称为ptr) - >下一个(以前的头) - >下一个 - >下一个 - >下一个 - >尾巴 - >空

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