📜  门| GATE 2017 MOCK II |第 32 题(1)

📅  最后修改于: 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,需要从头节点删除节点等。