文章

19

粉丝

0

获赞

0

访问

653

头像
2009年计算机学科专业基础综合试题 - 第42题回答
数据结构
发布于2025年6月18日 17:08
阅读数 40

(1) 设计思想
本题的目标是查找链表中倒数第k个节点(从末尾算起),不改变链表结构。最高效的方法是采用双指针(快慢指针)策略:

  • 使用两个指针i和j,都指向头结点(表头结点)。
  • 让j先向前走k步,若在此过程中j到达链尾,则返回失败(即链表长度小于k);
  • 然后,i和j一块向后同时移动,直到j到达链尾(null)。
  • 此时,i指向的节点即为倒数第k个节点。

此思想的核心是:

  • 让j领先i k步,然后两指针同步移动,保证当j到尾时,i即为倒数第k个节点。

(2) 算法详细步骤

  1. 初始化指针 i 和 j 指向链表的表头结点(即参数中的头指针list)。
  2. 让j向后移动k步:
    • 在每一步,判断j是否为null。
    • 若在k步内j为null,说明链表长度小于k,返回0。
  3. 指针i和j同步向后移动:
    • 在每一步同时移动i和j到下一节点(即i = i->next, j = j->next)。
    • 当j到达null时(即j指向的下一个节点为空),指针i即指向倒数第k个节点。
  4. 输出i的data域值,返回1。

(3) C++代码实现


 

#include <iostream> using namespace std; // 节点定义 struct ListNode { int data; ListNode* next; ListNode(int val) : data(val), next(nullptr) {} }; // 查找倒数第k个节点 int findKthFromEnd(ListNode* head, int k, int& value) { if (!head || k <= 0) return 0; ListNode* i = head; // 慢指针 ListNode* j = head; // 快指针 // j先走k步 for (int count = 0; count < k; ++count) { if (j == nullptr) { // 链表长度小于k return 0; } j = j->next; } // i和j同步前进,直到j到达链尾 w...

登录查看完整内容


登录后发布评论

暂无评论,来抢沙发