用C++算法实现输入一个单向链表,输出该链表中倒数第k个结点,链表的最后一个结点是倒数第一个结点,并输出测试用例
时间: 2024-09-20 17:17:25 浏览: 66
在C++中,可以使用双指针法(快慢指针)来解决这个问题。我们创建两个指针,初始时都指向头节点。然后让快指针每次向前移动k步,慢指针每次只前进一步。当快指针到达链表尾部时,慢指针的位置就是倒数第k个节点。
以下是简单的代码实现:
```cpp
#include <iostream>
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
ListNode* findKthToTail(ListNode* head, int k) {
if (!head || !k) return nullptr; // 链表为空或k为0的情况
ListNode* slow = head;
ListNode* fast = head;
for (int i = 0; i < k - 1; ++i) {
if (fast) fast = fast->next;
}
while (fast && fast->next) {
slow = slow->next;
fast = fast->next->next;
}
return slow;
}
// 测试用例
void test_case() {
// 创建链表示例: 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 = 3; // 查找倒数第三个节点
ListNode* result = findKthToTail(head, k);
if (result != nullptr) {
std::cout << "倒数第" << k << "个节点的值是: " << result->val << std::endl;
} else {
std::cout << "链表太短,无法找到倒数第" << k << "个节点" << std::endl;
}
delete result;
}
int main() {
test_case();
return 0;
}
```
在这个例子中,`findKthToTail`函数会返回倒数第k个节点,如果k大于链表长度,则返回nullptr。你可以修改`test_case`中的链表和k值来测试其他情况。
阅读全文