【问题标题】:Loop detection in LinkedList using C#使用 C# 在 LinkedList 中进行循环检测
【发布时间】:2012-01-11 06:42:27
【问题描述】:

在面试问题中,“实施一种检测循环存在的算法。”。比如链表有一个循环,比如:

0--->1---->2---->3---->4---->5---->6
                 ▲                 |
                 |                 ▼
                11<—-22<—-12<—-9<—-8

使用 Floyd 的循环检测,这个问题可以通过使用快慢指针来解决。所以我应该尝试比较

一个。 链接的节点值,即

if (fast.data == slow.data) 
    break;

其中快和慢的类型为Link

class Link
{
    int IData {get; set;}
    Link Next {get; set;}
}

b. 它们是否指向相同的参考文献,即if (fast == slow)

谢谢。

【问题讨论】:

  • if (fast == slow) 是正确的检查。

标签: c# linked-list floyd-cycle-finding


【解决方案1】:

您应该只比较节点本身。毕竟,里面有重复数据的链表是合理的,实际上没有循环。

我会将它们称为节点而不是链接。链接只是从一个节点到下一个或前一个节点的引用 - 特别是,没有与 link 关联的数据,只有一个 node

【讨论】:

  • 所以你说的是这个类应该被命名为:- Node{ int IData {get; set;} 节点下一个 {get;放;}}。然后比较像这样的节点;如果(快 == 慢)。谢谢,实际上这篇文章让我想到了解决方案:- link
  • @parsh:是的,就是这样。
【解决方案2】:

希望这会有所帮助......这可能很天真,但它有效......

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();
    }
   }
 }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-21
    • 1970-01-01
    • 1970-01-01
    • 2020-09-02
    • 2011-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多