唯一的区别是当前交换到当前>下一个。我认为它们的工作方式都相同,但显然不是。它是否将其与本地(当前(而不是头部混淆?
为什么 appendNodeTailCurrent 不起作用,但是当我使用 (appendNodeTailNext( current->next 时,它起作用了?
void appendNodeTailNext(NODE** head, int data) {
NODE* current = *head;
NODE* node = { 0 };
node = (NODE*)malloc(sizeof(NODE));
node->data = data;
node->next = NULL;
if (current == NULL) {
*head = node;
return;
}
while (current->next!= NULL) {
current = current->next;
}
current->next = node;
}
void appendNodeTailCurrent(NODE** head, int data) {
NODE* current = *head;
NODE* node = { 0 };
node = (NODE*)malloc(sizeof(NODE));
node->data = data;
node->next = NULL;
if (current == NULL) {
*head = node;
return;
}
while (current!= NULL) {
current = current->next;
}
current = node;
}
当*head
不NULL
时,第二个版本既不会更改列表的任何节点*head
也不会更改任何部分。因此,它不会更改列表。它只改变current
,一个一旦函数退出就不复存在的变量。
例如,假设列表中已经有四个节点。
第一个版本:
current
设置为第一个节点。- 第一个节点的
next
不是NULL
,所以循环被输入。 current
设置为第二个节点。- 第二个节点的
next
不是NULL
,所以进入循环。 current
设置为第三个节点。- 第三个节点的
next
不NULL
,所以进入循环。 current
设置为第四个节点。- 第四个节点的
next
是NULL
,所以循环退出。 - 第四个节点的
next
设置为新节点。
我们更改了一个节点(在最后一步(。
第二版:
current
设置为第一个节点。current
不是NULL
,所以进入循环。current
设置为第二个节点。current
不是NULL
,所以进入循环。current
设置为第三个节点。current
不是NULL
,所以进入循环。current
设置为第四个节点。current
不是NULL
,所以进入循环。current
设置为NULL
。current
不是NULL
,所以循环退出。current
设置为新节点。
我们没有更改*head
或节点。
有一种方法可以使第二种方法起作用:通过添加间接层。
void appendNodeTailCurrent(NODE** head, int data) {
NODE** ptr_to_ptr = head;
NODE* node = { 0 };
node = (NODE*)malloc(sizeof(NODE));
node->data = data;
node->next = NULL;
if (*ptr_to_ptr == NULL) {
*head = node;
return;
}
while (*ptr_to_ptr!= NULL) {
ptr_to_ptr = &( (*ptr_to_ptr)->next );
}
*ptr_to_ptr = node;
}
以上简化为以下内容:
void appendNodeTailCurrent(NODE** ptr_to_ptr, int data) {
while (*ptr_to_ptr != NULL) {
ptr_to_ptr = &( (*ptr_to_ptr)->next );
}
*ptr_to_ptr = malloc(sizeof(NODE));
(*ptr_to_ptr)->data = data;
(*ptr_to_ptr)->next = NULL;
}
您可以说您发布的第一个版本找到要更改的节点,而此版本找到要更改的指针。在您发布的第一个版本中,头部需要特别处理,因为它不是节点。但是由于头部是一个指针,我们不需要在这个版本中特别对待它。