如何遍历链表向量并完整遍历链表查找指定字符串节点?
解决链表向量的完整遍历问题
你的代码现在的问题一眼就能看出来——循环里每次都只盯着链表的头节点(table[index]->Begin()),哪怕循环跑了Size()次,检查的都是同一个节点,根本没遍历整个链表啊!
要实现完整遍历,核心是用一个指针(或者迭代器)从链表头部开始,逐个往后移动,直到走到链表末尾。下面给你两种常见场景的实现方案:
场景1:Dlist节点暴露next指针
如果你的Dlist节点结构是类似这样的(每个节点有字符串成员和下一个节点的指针):
struct DlistNode { string s; DlistNode* next; // 其他成员... };
并且Dlist类的Begin()方法返回链表的头节点指针,那修改后的Present方法可以写成这样:
int DL_Hash::Present(string &s) { int index = djb_hash(s) % table.size(); // 拿到当前哈希桶对应的链表头节点 DlistNode* currentNode = table[index]->Begin(); // 遍历整个链表:只要当前节点不为空,就继续检查 while (currentNode != nullptr) { if (currentNode->s == s) { return 1; // 找到目标字符串,直接返回存在 } currentNode = currentNode->next; // 移动到下一个节点 } return 0; // 遍历完整个链表都没找到,返回不存在 }
场景2:Dlist封装了迭代器(类似STL风格)
如果你的Dlist类设计得更规范,提供了迭代器接口(比如begin()返回起始迭代器,end()返回末尾标记,迭代器支持++移动),那代码可以更简洁:
int DL_Hash::Present(string &s) { int index = djb_hash(s) % table.size(); auto& targetList = *table[index]; // 简化代码,先拿到对应的链表 // 用迭代器遍历整个链表 for (auto it = targetList.begin(); it != targetList.end(); ++it) { if (it->s == s) { return 1; } } return 0; }
额外说明
- 你原来的
for循环完全是无效的:它只是重复了Size()次,但每次都从头节点开始,根本没移动到下一个节点,相当于做了无用功。 - 链表遍历的核心逻辑都是从头部开始,逐个访问每个节点,直到找到目标或到达末尾,不管用指针还是迭代器,本质都是一样的。
- 如果你的Dlist有其他遍历方式(比如提供了
GetNext(DlistNode*)这样的成员函数),只需要把currentNode = currentNode->next换成对应的函数调用就行,逻辑不变。
内容的提问来源于stack exchange,提问作者user9573040
相关产品推荐
相关产品推荐

