使用拓扑排序检测链表中的循环

时间:2019-06-10 20:42:10

标签: algorithm

给出以下链接列表

'use strict';

const Pages = require('./pages');
const Global = require('./global');
const Components = require('./components');
const Home = Pages.Home;
const Happenings = Pages.Happenings;
const Leasing = Pages.Leasing;
const Updates = Pages.Updates;
const Events = Pages.Events;
const EventSlider = Components.EventSlider;

module.exports = {
  init: function(){
    Global.init();
    if($('.home-page').length){ new Home(); }
    if($('.leasing-page').length){ new Leasing(); }
    if($('.happenings-page').length){ new Happenings(); }
    if($('.updates-page').length){ new Updates(); }
    if($('.update-page').length){ new Updates(); }
    if($('.things-to-do-page').length){ new Events(); }

    if($('.event-slider').length){ new EventSlider(); }
  }
};

我需要找到一种检测周期的方法。

我不能仅将其视为图形并进行拓扑排序吗? 如果失败,列表中是否有一个循环?

1 个答案:

答案 0 :(得分:0)

您可以使用检测周期的拓扑排序算法来执行此操作,也可以通过标记已访问的节点来使用链表的特殊结构,而这会给每个节点造成一点内存开销。它的工作方式如下:最初,所有访问位都设置为0。您输入一个节点。如果将其访问位设置为1,则您已经访问过,因此有一个循环,可以结束程序。如果不是,请将访问位设置为1并移至列表中的下一个节点。如果到达列表的末尾,但从未找到设置为1的位,则没有循环。如果您无法负担节点中的额外费用,则可以使用哈希表在外部执行此操作(尽管这可能会过分杀伤)。

基本上,如果您有一个没有循环的链表,那么您已经对节点进行了线性排序,这就是拓扑排序输出的结果,因此检查循环(在这种特殊情况下)仅是对潜在排序的验证由链接列表给出。