链表作业求助:如何根据用户输入输出链表末尾指定数量元素
解决链表输出最后n个元素的问题
你现有的traverse函数是从链表表头开始遍历到末尾,所以会打印全部元素。要实现输出最后n个元素的需求,可以按以下思路修改:
核心思路
要输出最后n个元素,首先得定位到倒数第n个元素的起始位置,再从该位置遍历到链表末尾即可。同时要处理边界情况:如果n≤0,提示输入无效;如果n大于链表总长度,直接输出全部元素。
实现步骤与代码修改
假设你的List类已有next()(移动到下一个节点并返回是否成功)、get()(获取当前节点值)这些方法,下面是针对性的实现:
#include <iostream> // 假设List和Node的定义已存在 void printLastNElements(List list, int n) { // 保存原链表的当前节点位置,避免修改后影响原有状态 Node *savedCurrentNode = list.currentNode; list.currentNode = list.headNode; // 第一步:计算链表总长度 int totalLength = 0; while (list.next() == true) { totalLength++; } // 遍历结束后重置回表头 list.currentNode = list.headNode; // 处理无效输入 if (n <= 0) { std::cout << "请输入大于0的整数" << std::endl; list.currentNode = savedCurrentNode; return; } // n大于等于总长度时直接输出全部元素 if (n >= totalLength) { for (int i = 1; list.next() == true; i++) { std::cout << "Element " << i << " " << list.get() << std::endl; } list.currentNode = savedCurrentNode; return; } // 第二步:移动到倒数第n个元素的前一个位置 int skipCount = totalLength - n; for (int i = 0; i < skipCount; i++) { list.next(); } // 第三步:从起始位置打印剩余元素 int count = 1; while (list.next() == true) { std::cout << "倒数第" << count << "个元素: " << list.get() << std::endl; count++; } // 恢复原链表的当前节点位置 list.currentNode = savedCurrentNode; }
调用示例
获取用户输入后直接调用函数即可:
int n; std::cout << "请输入要输出的最后元素个数:"; std::cin >> n; printLastNElements(yourList, n);
原函数问题说明
原traverse函数没有接收用户输入的n参数,也没有定位到目标起始位置,只是从头遍历到尾,所以会打印全部元素。上面的新函数针对需求做了修改,同时保留了保存/恢复链表当前节点的逻辑,避免影响链表原有状态。
内容的提问来源于stack exchange,提问作者mehar sulaiman
相关产品推荐
相关产品推荐

