给出以下链接列表
'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(); }
}
};
我需要找到一种检测周期的方法。
我不能仅将其视为图形并进行拓扑排序吗? 如果失败,列表中是否有一个循环?
答案 0 :(得分:0)
您可以使用检测周期的拓扑排序算法来执行此操作,也可以通过标记已访问的节点来使用链表的特殊结构,而这会给每个节点造成一点内存开销。它的工作方式如下:最初,所有访问位都设置为0。您输入一个节点。如果将其访问位设置为1,则您已经访问过,因此有一个循环,可以结束程序。如果不是,请将访问位设置为1并移至列表中的下一个节点。如果到达列表的末尾,但从未找到设置为1的位,则没有循环。如果您无法负担节点中的额外费用,则可以使用哈希表在外部执行此操作(尽管这可能会过分杀伤)。
基本上,如果您有一个没有循环的链表,那么您已经对节点进行了线性排序,这就是拓扑排序输出的结果,因此检查循环(在这种特殊情况下)仅是对潜在排序的验证由链接列表给出。