嵌套链表(linkedlist<linkedlist<int>>)遍历与实现问题咨询
嵌套链表的遍历指南
别担心,嵌套链表的遍历其实就是把你已经会的普通链表遍历逻辑套一层而已,咱们一步步拆解清楚~
核心逻辑理解
你说得没错,主链表的每个元素本身就是一个完整的子链表(比如linkedlist<int>),所以遍历的思路就是:
- 先遍历主链表的每一个节点,取出对应的子链表
- 对每个子链表,用你之前遍历普通
int链表的方式,遍历它的所有元素
下面分两种常见的实现场景给你示例代码:
场景1:你的linkedlist类支持迭代器(类似C++ STL风格)
如果你的链表类实现了范围for循环支持(或者有begin()/end()迭代器),那代码会非常简洁:
// 遍历主链表中的每一个子链表 for (auto& sub_list : nums) { // 对每个子链表,遍历它的所有int元素 for (int val : sub_list) { std::cout << val << " "; } std::cout << "\n"; // 每个子链表打印完换行,方便区分 }
场景2:手动操作节点指针(自定义链表的常见方式)
如果你的链表类是手动实现的,比如有getHead()方法获取头节点,节点结构大概是:
template <typename T> struct Node { T value; Node* next; Node(T val) : value(val), next(nullptr) {} };
那遍历代码就是两层嵌套的节点遍历:
// 获取主链表的头节点 auto main_current = nums.getHead(); while (main_current != nullptr) { // 当前主节点的值是一个子链表 linkedlist<int>& sub_list = main_current->value; // 遍历这个子链表,和你遍历普通int链表的逻辑完全一样 auto sub_current = sub_list.getHead(); while (sub_current != nullptr) { std::cout << sub_current->value << " "; sub_current = sub_current->next; } std::cout << "\n"; // 移动到主链表的下一个节点 main_current = main_current->next; }
额外提示:嵌套链表的初始化示例
如果还不确定怎么往嵌套链表中添加元素,这里给你一个简单的初始化例子,方便你测试遍历逻辑:
// 创建两个子链表 linkedlist<int> sub1; sub1.push_back(1); sub1.push_back(2); sub1.push_back(3); linkedlist<int> sub2; sub2.push_back(4); sub2.push_back(5); // 把子链表加入主链表 linkedlist<linkedlist<int>> nums; nums.push_back(sub1); nums.push_back(sub2);
其实本质上就是把“遍历单个链表”的操作重复了两次——先在外层链表循环,再对每个内层链表执行一次循环,完全不需要复杂的逻辑,你只是把问题想复杂啦😉
内容的提问来源于stack exchange,提问作者zavier
相关产品推荐
相关产品推荐

