C# 用C语言实现LinkedList中的循环检测#
在面试问题中,“实现一个算法,检测循环的存在。”。例如,链表有一个循环,如:C# 用C语言实现LinkedList中的循环检测#,c#,linked-list,floyd-cycle-finding,C#,Linked List,Floyd Cycle Finding,在面试问题中,“实现一个算法,检测循环的存在。”。例如,链表有一个循环,如: 0--->1---->2---->3---->4---->5---->6 ▲ | | ▼ 11<—-22<—-12<—-9<—-8 其中快速和慢速为链接类型 class Link { in
0--->1---->2---->3---->4---->5---->6
▲ |
| ▼
11<—-22<—-12<—-9<—-8
其中快速和慢速为链接类型
class Link
{
int IData {get; set;}
Link Next {get; set;}
}
或
b它们是否指向相同的引用,即如果(快==慢)
谢谢。您应该只比较节点本身。毕竟,有一个包含重复数据的链表是合理的,它实际上没有一个循环
我会称它们为节点,而不是链接。链接只是从一个节点到下一个或上一个节点的引用-特别是,没有与链接相关的数据,只有与节点相关的数据。希望这有帮助。。。这可能很幼稚,但它是有效的
using System;
namespace CSharpTestTemplates
{
class LinkedList
{
Node Head;
public class Node
{
public int value;
public Node NextNode;
public Node(int value)
{
this.value = value;
}
}
public LinkedList(Node head)
{
this.Head = head;
}
public Boolean hasLoop()
{
Node tempNode = Head;
Node tempNode1 = Head.NextNode;
while(tempNode!=null && tempNode1!=null){
if(tempNode.Equals(tempNode1)){
return true;
}
if ((tempNode1.NextNode != null) && (tempNode.NextNode != null))
{
tempNode1 = tempNode1.NextNode.NextNode;
tempNode = tempNode.NextNode;
}
else
{
return false;
}
}
return false;
}
public static void Main()
{
Node head = new Node(1);
LinkedList ll = new LinkedList(head);
Node node2 = new Node(2);
Node node3 = new Node(3);
Node node4 = new Node(4);
Node node5 = new Node(5);
Node node6 = new Node(6);
head.NextNode = node2;
node2.NextNode = node3;
node3.NextNode = node4;
node4.NextNode = node5;
node5.NextNode = node6;
node6.NextNode = null;
Console.WriteLine(ll.hasLoop());
Console.Read();
}
}
}
如果(fast==slow)
检查是否正确。那么您要说的是,该类的命名应该是:-节点{int-IData{get;set;}节点下一个{get;set;}}。然后比较节点类型;如果(快==慢)。谢谢,实际上这篇文章让我想到了解决办法:-@parsh:是的,就是这样。
using System;
namespace CSharpTestTemplates
{
class LinkedList
{
Node Head;
public class Node
{
public int value;
public Node NextNode;
public Node(int value)
{
this.value = value;
}
}
public LinkedList(Node head)
{
this.Head = head;
}
public Boolean hasLoop()
{
Node tempNode = Head;
Node tempNode1 = Head.NextNode;
while(tempNode!=null && tempNode1!=null){
if(tempNode.Equals(tempNode1)){
return true;
}
if ((tempNode1.NextNode != null) && (tempNode.NextNode != null))
{
tempNode1 = tempNode1.NextNode.NextNode;
tempNode = tempNode.NextNode;
}
else
{
return false;
}
}
return false;
}
public static void Main()
{
Node head = new Node(1);
LinkedList ll = new LinkedList(head);
Node node2 = new Node(2);
Node node3 = new Node(3);
Node node4 = new Node(4);
Node node5 = new Node(5);
Node node6 = new Node(6);
head.NextNode = node2;
node2.NextNode = node3;
node3.NextNode = node4;
node4.NextNode = node5;
node5.NextNode = node6;
node6.NextNode = null;
Console.WriteLine(ll.hasLoop());
Console.Read();
}
}
}