You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

链表作业求助:如何根据用户输入输出链表末尾指定数量元素

解决链表输出最后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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 04:40:27