📅  最后修改于: 2023-12-03 15:28:36.263000             🧑  作者: Mango
这是 Gate 2017 Mock II 的第 32 题,需要从给定的链表中找到倒数第 N 个节点,并将其删除。链表中节点从 1 开始标号,例如链表第一个节点为第 1 个节点。
首先,定义链表节点的结构体:
struct node {
int data;
struct node *next;
};
其中 data
字段存储节点的值,next
字段指向下一个节点。
由于我们要删除节点,我们需要保存链表的头节点(即第一个节点),因此定义链表的结构体如下:
struct list {
struct node *head;
};
我们可以用两个指针来解决这个问题:
p
首先指向链表的头节点;q
被移动到距离 p
N 个节点的位置。具体做法是,首先将 q
指向链表的头节点,然后移动 q
N-1 次;q
指向链表的最后一个节点时,节点 p
被删除。具体可以参考以下 C 语言代码实现:
void delete_nth_node_from_end(struct list *lst, int n) {
struct node *p, *q, *prev = NULL;
int i;
if (!lst->head) // 链表为空
return;
p = q = lst->head;
for (i = 0; i < n - 1 && q->next != NULL; i++) {
q = q->next;
}
if (i != n - 1) // 链表长度小于 N
return;
while (q->next != NULL) {
q = q->next;
prev = p;
p = p->next;
}
if (prev == NULL) // 删除头节点
lst->head = lst->head->next;
else
prev->next = p->next;
free(p); // 释放已删除节点的内存
}
本题目考察了对链表的基本操作,加深了对单向链表删除节点的理解和实现。同时,本题还要求考生考虑一些边界情况,例如链表长度小于 N,需要从头节点删除节点等。