cpp代码-输入一个链表,输出该链表中倒数第k个结点。
在C++编程中,处理链表数据结构是常见的任务之一。本示例代码旨在找到链表中的倒数第k个节点。链表是一种线性数据结构,由一系列节点组成,每个节点包含数据和指向下一个节点的指针。在这个问题中,我们需要设计一个算法来定位链表中从尾部开始数的第k个节点。 我们定义链表节点的结构体,通常命名为`ListNode`。这个结构体至少包含一个数据成员(如`int val`)和一个指向下一个节点的指针(如`ListNode* next`): ```cpp struct ListNode { int val; ListNode *next; ListNode(int x) : val(x), next(NULL) {} }; ``` 接下来,我们需要实现一个函数来找到倒数第k个节点。一种有效的方法是使用两个指针,一个快指针(每次前进k步)和一个慢指针(每次前进1步)。当快指针到达链表末尾时,慢指针将位于倒数第k个节点。以下是如何实现这个算法的C++代码: ```cpp ListNode* findKthFromEnd(ListNode* head, int k) { if (!head || k <= 0) return nullptr; // 检查无效输入 ListNode* fast = head; ListNode* slow = head; // 让快指针先走k-1步,以便两者同步时,快指针在目标节点后面 for (int i = 0; i < k - 1 && fast; ++i) { fast = fast->next; } // 如果k大于链表长度,快指针会提前到达末尾,此时慢指针就是目标节点 if (!fast) return slow; // 两个指针同步移动,直到快指针到达末尾 while (fast->next) { fast = fast->next; slow = slow->next; } return slow; // 返回倒数第k个节点 } ``` 在这个函数中,我们首先检查输入参数是否有效,例如链表头为空或k小于等于0。然后,快指针向前移动k-1步,使它位于目标节点之后。如果k大于链表长度,快指针会提前到达末尾,此时慢指针就是倒数第k个节点。否则,两个指针同步移动,直到快指针到达末尾,慢指针则停在了倒数第k个节点。 为了测试这个函数,你需要创建一个链表并调用`findKthFromEnd`。在main函数中,你可以这样做: ```cpp int main() { // 创建链表:1 -> 2 -> 3 -> 4 -> 5 ListNode* head = new ListNode(1); head->next = new ListNode(2); head->next->next = new ListNode(3); head->next->next->next = new ListNode(4); head->next->next->next->next = new ListNode(5); int k = 2; // 找到倒数第2个节点 ListNode* kthNode = findKthFromEnd(head, k); if (kthNode) { std::cout << "倒数第" << k << "个节点的值是:" << kthNode->val << std::endl; } else { std::cout << "链表太短,无法找到倒数第" << k << "个节点" << std::endl; } // 释放内存 ListNode* curr = head; while (curr) { ListNode* temp = curr; curr = curr->next; delete temp; } return 0; } ``` 这段`main`函数中,我们创建了一个包含五个节点的链表,然后寻找倒数第二个节点。运行后,程序会输出倒数第2个节点的值,即4。我们释放所有分配的内存以防止内存泄漏。 解决这个问题的关键在于理解链表的特性和使用双指针技巧。通过这种方式,我们可以高效地找到链表中的任意位置节点,而不需要遍历整个链表两次。