在采访问题中,“实施一种检测环路存在的算法”。例如,链表有一个循环,如:
0--->1---->2---->3---->4---->5---->6
▲ |
| ▼
11<—-22<—-12<—-9<—-8
使用Floyd的循环检测,这个问题可以通过使用快速&amp;慢指针。我应该尝试比较
一个。 链接的节点值,即
if (fast.data == slow.data)
break;
快速和慢速类型为Link
class Link
{
int IData {get; set;}
Link Next {get; set;}
}
OR
湾他们是否指向相同的参考,即if (fast == slow)
感谢。
答案 0 :(得分:7)
您应该只比较节点本身。毕竟,有一个包含重复数据的链表是合理的,而实际上没有一个循环。
我会调用他们的节点而不是链接。链接只是从一个节点到下一个节点或前一个节点的引用 - 特别是,没有与链接关联的数据,只有节点。
答案 1 :(得分:0)
希望这会有所帮助......它可能很幼稚,但它有效......
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();
}
}
}