在单向链表中查找循环
Finding cycle in singly linked list
在单链表中查找循环并找到循环开始的节点。我已经看到使用两个指针(通常慢和快)来查找循环,但是我已经编写了此代码,它似乎工作正常。我的问题是,在单向链表中查找循环时,我的代码是否遗漏了一些东西。
Node* find_cycle_node(Node *head){
Node *p=head;
Node *q;
while(p->next!=null)
{
q=p->next;
while(q->next!=null)
{
if(p==q) return q; //Node repeated i.e cycle
else (q=q->next;)
}
p=p->next;
}
return null; // no cycle detected
}
如果句柄上有几个节点的循环,你的内部循环将不会终止,例如,对于这样的事情,它将是一个无限循环:
1 -> 2 -> 3 -> 4 -> 5
^ |
| |
+---------+
这个怎么样?
struct Node_
{
int ix ;
struct Node_* next ;
} ;
typedef struct Node_ NODE ;
NODE *head = NULL ;
int main()
{
NODE* n1 ;
n1 = (NODE*) malloc(sizeof(NODE)) ;
n1->ix = 0 ;
n1->next = NULL ;
head = n1 ;
NODE* n2 ;
n2 = (NODE*) malloc(sizeof(NODE)) ;
n2->ix = 1 ;
n2->next = NULL ;
n1->next = n2 ;
NODE* n3 ;
n3 = (NODE*) malloc(sizeof(NODE)) ;
n3->ix = 2 ;
n3->next = NULL ;
n2->next = n3 ;
NODE* n4 ;
n4 = (NODE*) malloc(sizeof(NODE)) ;
n4->ix = 3 ;
n4->next = n2 ;
n3->next = n4 ;
unordered_map<NODE*,int> hashx ;
int idx ;
NODE* p = head ;
while(p != NULL)
{
hashx[p] += 1 ;
if(hashx[p] >= 2)
{
printf("node p (%d) recycle !!n",p->ix);
break ;
}
p = p->next ;
}
printf("done n") ;
} //main
我的代码是否遗漏了什么
return; // no cycle detected
这行看起来很糟糕,应该改成 s.th。
return NULL; // no cycle detected
对我来说,
你的内部循环条件似乎是模棱两可的。您正在分析如果 (p==q) 其中 q 是下一个 p->。这意味着之前考虑的节点 P 没有一个周期。所以对我来说,你的内心循环永远不会终止。
您必须考虑这一点:-
#include <iostream>
using namespace std;
class Node{
public:
int data;
Node * next;
Node(int x){
data = x;
next = NULL;
}
Node(int x, Node * y){
data = x;
next = y;
}
};
class linkedList{
Node *head;
public:
linkedList(){
head = NULL;
}
void addNode(int value){
Node *p;
if(head == NULL)
head = new Node (value, NULL);
else{
p = head;
while(p->next !=NULL)
p=p->next;
p->next = new Node (value, NULL);
}
}
void print(){
Node * p;
p = head;
while(p != NULL){
cout << p->data;
p = p->next;
}
}
int findCycle(){
Node *p, *start, *q;
p = head;
while(p != NULL){
q = p->next;
while (q != NULL ){
if(p->data == q->data)
return q->data;
else
q = q->next;
}
p = p->next;
}
return 0;
}
};
int main(){
linkedList l1;
l1.addNode(1);
l1.addNode(2);
l1.addNode(3);
l1.addNode(4);
l1.addNode(5);
l1.addNode(3);
int node = l1.findCycle();
cout<<node;
return 0;
}
你怎么说人们关于这个代码。
void LinkListOps::createCycledListAndFindACycleNode()
{ 构建包含循环的列表
ZNODE* head = new ZNODE(0);
ZNODE* current = head;
ZNODE* cycle = 0;
for (int i = 1; i < 8; i++)
{
current->_next = new ZNODE(i);
current = current->_next;
if (i == 6)
cycle = current;
if (i == 7)
current->_next = cycle;
}
// verify that there is a cycle
ZNODE* slow = head;
ZNODE* fast = head;
ZNODE* cycleNode = 0;
while (slow && fast && fast->_next)
{
slow = slow->_next;
fast = fast->_next->_next;
if (slow == fast)
{
cycleNode = slow;
break;
}
}
if (cycleNode == 0)
{
printf("No cyclen");
return;
}
// finally find a cycle node which will be p2
ZNODE* p1 = head;
ZNODE* p2 = cycleNode;
while (1)
{
for (p2 = cycleNode; p2->_next != cycleNode; p2 = p2->_next)
{
if (p2 == p1)
break;
}
if (p2 == p1)
break;
p1 = p1->_next;
}
printf("%dn", p2->_i);
}
您可以通过执行以下操作快速确定链表中是否存在循环:
ptr = head;
current = nullptr;
if (!ptr) {
current = ptr->next;
while(current && current!=ptr) {
current = current->next;
if (current) {
current = current->next;
}
ptr = ptr->next;
}
}
最后,如果current
不为 null,则找到一个循环,current
将位于其中的某个位置。 这是通过迭代列表current
速度是ptr
的两倍来工作的,并且总是会在循环之前找到一个循环(如果有的话),ptr
循环一次。
相关文章:
- 在 for 循环中查找问题时遇到困难
- 在 c++ 中查找字符串中没有循环的数字总和
- 程序以使用 C++ 中的 while 循环查找一组数字的最小值
- 用于在 C++ 中使用 while 循环查找下一个素数的简单函数
- 优化在网格图中查找哈密尔循环的函数?
- 尝试创建一个程序来查找非二叉树的高度.最终得到一个很长的循环,没有答案
- c ++如何使用for循环查找重复项
- 尝试在图形中查找最短路径时的无限循环
- C++ 数据结构队列:使用 for 循环查找队列中最大的元素
- 查找涉及 while 循环的运行时函数
- std::在地图上查找无法正常工作并循环访问地图的键和值
- char数组反向查找使用无循环
- 尝试在自定义 QT 创建器文本编辑器中创建查找和替换循环.我似乎无法设置光标位置
- 查找 for 循环数组C++中存在最大值和最小值的值
- C 如何打破while查找循环
- C 查找无SQRT函数循环故障的平方根
- 在使用无序多映射实现的有向图中查找循环
- 在单向链表中查找循环
- 查找循环队列中的元素数
- 如何查找循环依赖项