假设我有一个这样的列表:
[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
但事实显然并非如此。
一旦他们没有箭头符号->
,我似乎迷失了正在发生的事情(对于大多数现有的功能)。任何帮助将不胜感激!
答案 0 :(得分:0)
这里的问题是你在考虑具体实例的指针,而不是作为内存位置的实际指针。
在您引用的问题中,head是指向包含节点实例的内存位置的指针。
代码:
head = ptr
正在更新头部指向的内存位置,而头部的原始位置现在包含在ptr-> next中。
要获取head的实际节点值,需要取消引用指针:
*head
因此,例如,给定一个链接列表头指向内存位置8,其中包含一个值为' a'的节点实例,以及一个新输入' b':
在执行代码之前,您指向:
执行突出显示的代码块后:
答案 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) - >下一个(以前的头) - >下一个 - >下一个 - >下一个 - >尾巴 - >空
现在您已将新值插入列表的前面。