【问题标题】:Understanding adding to Front of a Linked List了解添加到链表的前面
【发布时间】:2015-11-13 17:14:03
【问题描述】:

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

[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 指向那个节点。

标签: c data-structures linked-list nodes


【解决方案1】:

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

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

代码:
头=点

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

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

*head

例如,给定一个指向内存位置 8 的链表头,其中包含一个值为“a”的节点实例和一个新的输入“b”:

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

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

【讨论】:

    【解决方案2】:

    假设你有一个这样的链表:

     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
    

    很快,插入就完成了。

    【讨论】:

      【解决方案3】:

      详情如下:

      您的指针如下所示:

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

      ptr->value = input;
      

      现在看起来像这样:

      head -> next -> next -> next -> tail -> null

      ptr -> 空

      所以你现在基本上有两个列表。

      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

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

      【讨论】:

        猜你喜欢
        • 2011-06-20
        • 2015-06-01
        • 2016-03-26
        • 2016-09-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-12-16
        • 2019-12-17
        相关资源
        最近更新 更多