为什么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 的前一个节点。
也就是,如果需要删除一个节点,必须要知道这个节点的上一个节点,这样才能在删除节点前,让该节点的前一个节点链接该节点的下一个节点。
节点删除步骤如下图所示:
在这段代码中,你的链表头节点是 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)
。