開始ノードが関数に正しく渡されていれば、私のソリューションはうまく動作します。私の解決策が良いと効率的であるかどうかを知りたい。最初のノードがパラメータとして渡される関数を介してサイクルが存在する場合はtrueを返すことができます。私の解決策がインタビューのために特に有効かどうかを知りたい。コード内の私のコメントは自明です。私は可変トラックを使ってリストをたどり、次のものとしてヌルか頭をチェックします。もし私がそれらのいずれかに遭遇した場合、トラバース終了し、個別に私はnullまたは頭の状態をチェックし、それに基づいて適切なブール値を返します。javascriptを使用した単一リンクリストのサイクルの検索(私のソリューションは効率的です)
function SLLNode(elem) {
this.value=elem;
this.next=null;
}
var hasCycle=function(node){
var track=node;
//traverse thru list till next node is either null or back to first node
while(track.next!==null && track.next!==this.head){
track=track.next;
}
if(track.next === null){ //if next node null then no cycle
return false;
}
if(track.next===this.head){ //if next node head then there is cycle
return true;
}
}
var my_node1=new SLLNode(3);
var my_node2=new SLLNode(5);
var my_node3=new SLLNode(19);
//assigning head
var head=my_node1;
//connecting linked list
my_node1.next=my_node2;
my_node2.next=my_node3;
my_node3.next=my_node1; //cycle
console.log("Has cycle?: "+hasCycle(my_node1)); //outputs true as expected
var node1=new SLLNode(3);
var node2=new SLLNode(5);
var node3=new SLLNode(19);
//assigning head
var head1=node1;
node1.next=node2;
node2.next=node3;
console.log("Has cycle?: "+hasCycle(node1)); //outputs false as expected