c-理解添加到链表前面



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

[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],因此我们有两个节点[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. ptr->值=='b'
  6. ptr->next=NULL

一旦您高亮显示的代码块被执行:

  1. 水头==12
  2. 头->值=='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

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

 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

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

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

在此之前,插入完成。

以下是详细信息:

你的指针看起来是这样的:

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

ptr->value = input;

现在看起来是这样的:

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

ptr->空

在这一点上,你基本上有两个列表。

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

现在你附上了你的两个清单:

ptr->head->next->next->exter->tail->null

head = ptr;

现在,您要确保您所称的head指向那个新块,而不是旧块。

head(原来的ptr)->next(以前的head)->next->next->tail->null

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

相关内容

  • 没有找到相关文章

最新更新