输入一个单向链表,输出该链表中倒数第k个结点,链表的倒数第1个结点为链表的尾指针。 链表结点定义如下: struct ListNode { int m_nKey; ListNode* m_pNext; }; 正常返回倒数第k个结点指针,异常返回空指针. 要求: (1)正序构建链表; (2)构建后要忘记链表长度。 数据范围:链表长度满足 1 ≤ � ≤ 1000 1≤n≤1000 , � ≤ � k≤n ,链表中数据满足 0 ≤ � � � ≤ 10000 0≤val≤10000 本题有多组样例输入。 输入描述: 输入说明 1 输入链表结点个数 2 输入链表的值 3 输入k的值 输出描述: 输出一个整数 c++
时间: 2023-08-15 14:10:23 浏览: 114
你可以使用双指针的方法来解决这个问题。首先,定义两个指针 `p1` 和 `p2`,初始时都指向链表的头结点。然后,将 `p2` 向后移动 `k-1` 步,使得 `p1` 和 `p2` 之间相差 `k-1` 个结点。接下来,同时移动 `p1` 和 `p2`,直到 `p2` 到达链表的尾部。此时,`p1` 指向的就是倒数第 `k` 个结点。
以下是一个示例代码,展示了如何找到链表中倒数第 `k` 个结点:
```cpp
#include <iostream>
struct ListNode {
int m_nKey;
ListNode* m_pNext;
};
ListNode* findKthFromEnd(ListNode* head, int k) {
if (head == nullptr || k <= 0) {
return nullptr;
}
ListNode* p1 = head;
ListNode* p2 = head;
// 将 p2 向后移动 k-1 步
for (int i = 0; i < k - 1; i++) {
if (p2->m_pNext != nullptr) {
p2 = p2->m_pNext;
} else {
// 链表长度小于 k
return nullptr;
}
}
// 同时移动 p1 和 p2
while (p2->m_pNext != nullptr) {
p1 = p1->m_pNext;
p2 = p2->m_pNext;
}
return p1;
}
int main() {
int n;
std::cout << "Enter the number of nodes: ";
std::cin >> n;
ListNode* head = nullptr;
ListNode* tail = nullptr;
// 构建链表
for (int i = 0; i < n; i++) {
int value;
std::cout << "Enter the value of node " << i + 1 << ": ";
std::cin >> value;
ListNode* newNode = new ListNode();
newNode->m_nKey = value;
newNode->m_pNext = nullptr;
if (head == nullptr) {
head = newNode;
tail = newNode;
} else {
tail->m_pNext = newNode;
tail = newNode;
}
}
int k;
std::cout << "Enter the value of k: ";
std::cin >> k;
ListNode* result = findKthFromEnd(head, k);
if (result != nullptr) {
std::cout << "The value of the kth node from the end: " << result->m_nKey << std::endl;
} else {
std::cout << "Exception: Invalid k value or insufficient list length." << std::endl;
}
// 释放链表内存
ListNode* currNode = head;
while (currNode != nullptr) {
ListNode* temp = currNode;
currNode = currNode->m_pNext;
delete temp;
}
return 0;
}
```
在上述示例代码中,我们首先定义了一个 `findKthFromEnd` 函数,用于找到链表中倒数第 `k` 个结点。然后,在 `main` 函数中,从用户输入读取链表的节点个数 `n`,构建链表,并读取 `k` 的值。最后,调用 `findKthFromEnd` 函数找到倒数第 `k` 个结点,并输出其值。
请注意,在使用链表完成任务后,记得释放链表的内存,避免内存泄漏。
阅读全文