设计时间和空间上都尽可能高效的算法,在不改变链表的前提下,求链式存储的线性表的倒数第m(m>0)个元素。 输入分三行: 第一行输入链表中元素,以-1作为结束,用空格分隔; 第二行为m值 输出:第m个元素值,否则输出“ERROR”
时间: 2024-10-21 11:06:08 浏览: 28
求链式线性表的倒数第K项_C语言_K._
5星 · 资源好评率100%
要设计一个高效的时间和空间复杂度都尽可能低的算法来查找链表中的倒数第m个节点,我们可以使用快慢指针的方法。快指针每次前进两步,慢指针每次前进一步,当快指针到达链表尾部时,慢指针就会停在倒数第二个位置。然后我们再移动慢指针m次,即可找到倒数第m个节点。
以下是一个简单的C++实现:
```cpp
#include <iostream>
struct ListNode {
int val;
ListNode* next;
ListNode(int x) : val(x), next(NULL) {}
};
ListNode* findKthToTail(ListNode* head, int m) {
if (head == nullptr || m <= 0) {
return nullptr;
}
ListNode* fast = head;
ListNode* slow = head;
// 快慢指针移动,直到快指针到达尾部
while (fast != nullptr && fast->next != nullptr) {
fast = fast->next->next;
slow = slow->next;
}
// 如果m超过链表长度,则返回nullptr,表示不存在倒数第m个节点
if (fast == nullptr) {
return nullptr;
}
// 移动慢指针m次,找到倒数第m个节点
for (int i = 0; i < m - 1; ++i) {
if (slow == nullptr) {
return nullptr;
}
slow = slow->next;
}
return slow;
}
int main() {
std::string input;
std::cin >> input;
// 假设input是以空格分隔的一串整数,最后一个数字后跟-1
std::istringstream iss(input);
int val;
ListNode* prev = nullptr, *current = new ListNode(0);
while (iss >> val && val != -1) {
prev = current;
current = new ListNode(val);
prev->next = current;
}
current->next = nullptr;
int m;
std::cin >> m;
ListNode* result = findKthToTail(current, m);
if (result == nullptr) {
std::cout << "ERROR" << std::endl;
} else {
std::cout << "The value of the " << m << "th element from the tail is: " << result->val << std::endl;
}
delete current;
return 0;
}
```
阅读全文