鱼C论坛

 找回密码
 立即注册
查看: 503|回复: 1

[已解决]输出单链表倒数第K个结点值

[复制链接]
发表于 2024-10-25 20:01:23 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
【问题描述】

输入一个单向链表,输出该链表中倒数第k个结点,链表的最后一个结点是倒数第1个节点。

【输入形式】

输入第一位为K值,其后接一串以空格分隔的整型值。
【输出形式】

输出为倒数第K个结点的值,若无,则输出Not Found

【样例输入】

3 13 45 54 32 1 4 98 2
【样例输出】

4
【样例说明】

K值为3,则输出链表倒数第3个结点的值,为4;数据输入间以空格隔开
【评分标准】

本题要综合输出正确性及使用的数据结构。需由输入数据构建单链表。不使用链表的将不得分。

这题用C++怎么做
最佳答案
2024-10-25 20:01:32
我们可以使用C++编写一个程序,通过构建一个单向链表获取倒数第K个节点的值。以下是实现步骤和代码示例:

1. 定义链表节点的结构。
2. 创建链表并读取输入值。
3. 使用双指针方法找到倒数第K个节点。

  1. #include <iostream>
  2. #include <sstream>
  3. #include <vector>

  4. struct ListNode {
  5.     int value;
  6.     ListNode* next;
  7.     ListNode(int val) : value(val), next(nullptr) {}
  8. };

  9. ListNode* createLinkedList(const std::vector<int>& values) {
  10.     ListNode* head = nullptr;
  11.     ListNode* tail = nullptr;
  12.     for (int value : values) {
  13.         ListNode* newNode = new ListNode(value);
  14.         if (!head) {
  15.             head = newNode;
  16.         } else {
  17.             tail->next = newNode;
  18.         }
  19.         tail = newNode;
  20.     }
  21.     return head;
  22. }

  23. void findKthFromEnd(ListNode* head, int k) {
  24.     ListNode* first = head;
  25.     ListNode* second = head;

  26.     for (int i = 0; i < k; ++i) {
  27.         if (!first) {
  28.             std::cout << "Not Found" << std::endl;
  29.             return;
  30.         }
  31.         first = first->next;
  32.     }

  33.     while (first) {
  34.         first = first->next;
  35.         second = second->next;
  36.     }

  37.     if (second) {
  38.         std::cout << second->value << std::endl;
  39.     } else {
  40.         std::cout << "Not Found" << std::endl;
  41.     }
  42. }

  43. int main() {
  44.     std::string line;
  45.     std::getline(std::cin, line);
  46.     std::istringstream iss(line);
  47.    
  48.     int k;
  49.     iss >> k;

  50.     std::vector<int> values;
  51.     int num;
  52.     while (iss >> num) {
  53.         values.push_back(num);
  54.     }

  55.     ListNode* head = createLinkedList(values);
  56.     findKthFromEnd(head, k);

  57.     return 0;
  58. }
复制代码


### 代码解释
- **ListNode结构体**: 表示链表节点,包含整数值和一个指向下一个节点的指针。
- **createLinkedList函数**: 根据输入的整数数组创建链表。
- **findKthFromEnd函数**: 使用双指针方法找到倒数第K个节点。
  - 第一个指针先移动K步,然后两个指针同时移动,直到第一个指针到达末尾。
  - 此时,第二个指针所指即为倒数第K个节点。
- **main函数**: 处理输入,创建链表并调用查找函数。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2024-10-25 20:01:32 | 显示全部楼层    本楼为最佳答案   
我们可以使用C++编写一个程序,通过构建一个单向链表获取倒数第K个节点的值。以下是实现步骤和代码示例:

1. 定义链表节点的结构。
2. 创建链表并读取输入值。
3. 使用双指针方法找到倒数第K个节点。

  1. #include <iostream>
  2. #include <sstream>
  3. #include <vector>

  4. struct ListNode {
  5.     int value;
  6.     ListNode* next;
  7.     ListNode(int val) : value(val), next(nullptr) {}
  8. };

  9. ListNode* createLinkedList(const std::vector<int>& values) {
  10.     ListNode* head = nullptr;
  11.     ListNode* tail = nullptr;
  12.     for (int value : values) {
  13.         ListNode* newNode = new ListNode(value);
  14.         if (!head) {
  15.             head = newNode;
  16.         } else {
  17.             tail->next = newNode;
  18.         }
  19.         tail = newNode;
  20.     }
  21.     return head;
  22. }

  23. void findKthFromEnd(ListNode* head, int k) {
  24.     ListNode* first = head;
  25.     ListNode* second = head;

  26.     for (int i = 0; i < k; ++i) {
  27.         if (!first) {
  28.             std::cout << "Not Found" << std::endl;
  29.             return;
  30.         }
  31.         first = first->next;
  32.     }

  33.     while (first) {
  34.         first = first->next;
  35.         second = second->next;
  36.     }

  37.     if (second) {
  38.         std::cout << second->value << std::endl;
  39.     } else {
  40.         std::cout << "Not Found" << std::endl;
  41.     }
  42. }

  43. int main() {
  44.     std::string line;
  45.     std::getline(std::cin, line);
  46.     std::istringstream iss(line);
  47.    
  48.     int k;
  49.     iss >> k;

  50.     std::vector<int> values;
  51.     int num;
  52.     while (iss >> num) {
  53.         values.push_back(num);
  54.     }

  55.     ListNode* head = createLinkedList(values);
  56.     findKthFromEnd(head, k);

  57.     return 0;
  58. }
复制代码


### 代码解释
- **ListNode结构体**: 表示链表节点,包含整数值和一个指向下一个节点的指针。
- **createLinkedList函数**: 根据输入的整数数组创建链表。
- **findKthFromEnd函数**: 使用双指针方法找到倒数第K个节点。
  - 第一个指针先移动K步,然后两个指针同时移动,直到第一个指针到达末尾。
  - 此时,第二个指针所指即为倒数第K个节点。
- **main函数**: 处理输入,创建链表并调用查找函数。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-5-10 00:01

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表