关于#数据结构#的问题:数据结构代码求解释(语言-c++)

img

为什么while (t->next != NULL)中不能是t!=next,随带帮我解释一下这串代码

while (t->next != NULL) 表示只要当前节点的下一个节点不为空,就一直继续遍历。这里使用 t->next != NULL 来判断是否到达链表的末尾,而不是 t != NULL,是因为 t 不为空可以保证当前节点存在,但是 t->next 可能为空,如果用 t != next 来判断,就会漏掉最后一个节点,因为最后一个节点的下一个节点是 NULL,不满足 t != next 的判断条件。
整体的代码就是输入学号之后,遍历链表,如果t的下个节点的id与输入的相等,分在末尾和中间两种情况,末尾直接释放最后一个节点并指向null,中间的话用一个临时的变量f来记录t的next,让t的next指向f的next实现跳过中间的节点。

在链表中删除一个节点 f 的时候,为了在删除 f 后保证链表的连续性,就需要知道 f 的前一个节点和后一个节点。
因为,需要让 f 节点的前一个节点的next 指向 f 节点的下一个节点,这样才能保证 删除 f 节点后,链表仍然是连续的(删除 f 节点后链表不断开)。
所以,while循环中,使用的是 t->next != NULL,这里 t->next就相当于上面说的 f,t 就是 f 的前一个节点。
也就是,如果需要删除一个节点,必须要知道这个节点的上一个节点,这样才能在删除节点前,让该节点的前一个节点链接该节点的下一个节点。
节点删除步骤如下图所示:

img

在这段代码中,你的链表头节点是 head

首先,我们需要找到要删除的节点,因此使用了 while (t->next != NULL) 表示在 t 节点之后还有节点,也就是还没有到达链表结尾。这里使用了 t 节点的下一个节点 t->next 来判断是否到达链表结尾,因为如果 t 节点是链表的最后一个节点,那么它的下一个节点就是空节点 NULL

如果找到了待删除的节点,就需要判断这个节点是否是最后一个节点,这里的一次判断是 if (t->next->next == NULL)。如果是最后一个节点,则直接将 t 节点的 next 指针设为空即可,从而达到删除节点的目的。

如果不是最后一个节点,则要从链表中删除该节点,这里使用指针操作完成。具体来说,定义了指针变量 f 指向待删除的节点,然后将 t 节点的 next 指针指向 f 节点的 next 指针,这样在链表中就没有了 f 节点,完成了节点的删除。

最后输出删除成功的信息并结束函数。

至于为什么循环条件不能写成 while(t != NULL) 呢?这是因为,如果这样写,每次循环时需要判断当前节点 t 是否为 NULL,如果是则退出循环。但是,我们在删除节点时,需要判断待删除节点的下一个节点是否为 NULL。如果循环条件写成 while(t != NULL),则在找到待删除节点时,t->next 可能就已经为 NULL 了,导致在执行 if (t->next->next == NULL) 判断时会因为第一个 t->next 为 NULL 而发生错误,因此循环条件中应该使用 while (t->next != NULL)