📌  相关文章
📜  给出在单链表中查找倒数第 i 个节点的算法,其中最后一个节点由空的下一个引用指示. - C++ (1)

📅  最后修改于: 2023-12-03 15:27:34.268000             🧑  作者: Mango

在单链表中查找倒数第 i 个节点的算法

在单链表中查找倒数第 i 个节点是一项基本的操作,如果不掌握这个算法,会导致很多链表问题的无从下手。下面给出一个 C++ 实现的算法,希望能对大家有所帮助。

算法思路

我们可以使用双指针来实现这个算法。具体来说,我们定义两个指针 p 和 q,初始时 p 和 q 都指向链表的头节点。我们首先让 q 向前移动 i-1 步,然后让 p 和 q 同时向前移动,直到 q 指向链表的最后一个节点。此时 p 指向的节点就是倒数第 i 个节点。

代码实现

下面是一个完整的 C++ 实现:

// 链表节点的定义
struct ListNode {
    int val;
    ListNode *next;
    ListNode(int x) : val(x), next(NULL) {}
};

ListNode* findKthFromEnd(ListNode* head, int k) {
    ListNode *p = head, *q = head;
    // 将 q 移动到第 k 个节点
    for (int i = 0; i < k; i++) {
        if (q == NULL) return NULL;
        q = q->next;
    }
    // 同时移动 p 和 q
    while (q != NULL) {
        p = p->next;
        q = q->next;
    }
    return p;
}

首先定义了链表节点的结构体,包含一个 int 类型的值和一个指向下一个节点的指针。另外还定义了一个名为 findKthFromEnd 的函数,用于查找倒数第 k 个节点。函数的第一个参数 head 是链表的头节点,第二个参数 k 是正整数。

在函数中,我们定义了两个指针 p 和 q,初始时它们都指向链表的头节点。然后我们将 q 移动到第 k 个节点,这里也需要做一次非空判断,如果 q 已经指向了链表的最后一个节点而不是第 k 个节点,那么我们可以直接返回 NULL。

接下来,我们再次同时移动 p 和 q,直到 q 指向链表的最后一个节点。此时 p 指向的节点就是倒数第 k 个节点,我们将其返回即可。

总结

在单链表中查找倒数第 k 个节点是一项非常基本的操作,掌握这个算法对于解决其他链表问题非常重要。希望这篇文章能对大家有所帮助。