如何解决节点上的链表操作展开周期检测 结构功能
结构
SinglyLinkedListNode {
int data;
SinglyLinkedListNode* next;
};
功能
bool has_cycle(SinglyLinkedListNode* head) {
SinglyLinkedListNode* s=head,*f=head->next;
while(s != NULL && f != NULL && f->next != NULL)
{
s = s->next;
f = f->next->next;
if(s->data == f->data)
return true;
}
return false;
}
根据该算法,如果慢指针s
和快指针f
到达同一节点,则该列表被称为具有循环。我假设同一节点将具有相同的数据,但是为什么我的测试用例失败了?
当我将(s->data = f->data)
更改为(s == f)
时,它可以正常工作。
s == f
和s->data == f->data
有什么区别?
解决方法
这里的主要问题是您的最终检查条件。在可能存在重复项(在循环中)的测试用例中,这将失败。当您检查“相同节点”时,检查指针值是否相同会更好,因为它始终是唯一的,即每个节点都有一个唯一的地址,但对于节点包含的值,它不必为真。例如:
1-> 3-> 4-> 5-> 6-> 4-> 7->空
//注意给出相对索引(0th,1st,..和随机寻址以便理解)
迭代1:s位于1(第0个节点,1000010092),而f位于3(第1个节点,21983193)
迭代2:s位于3(第一节点,21983193),而f位于5(第三节点,129764714)
迭代3:s位于4(第二个节点,12984124),而f位于4(第五个节点,149284124)
看到含糊不清!
即使您的算法给出了TRUE,也不存在循环。 但是,如果您通过寻址检查,则不会发生这种误报。 提示:检查是否存在任何重复问题,通常会添加这些重复问题以解决此类问题。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。