실행 가능한 코드는 다음과 같습니다.
내가 한 것은 O(1)
링크를 추적 하는 3 개의 임시 노드 (공간 복잡성 )를 사용하여 링크 된 목록을 존중하는 것입니다 .
이 작업에 대한 흥미로운 사실은 연결 목록에서주기를 감지하는 데 도움이되는 것입니다. 앞으로 나아갈 때 시작점 (루트 노드)으로 돌아갈 것으로 예상하지 않고 임시 노드 중 하나가 null이 아닌 경우 루트 노드를 가리키는주기를가집니다.
이 알고리즘의 시간 복잡도는 O(n)
공간 복잡도입니다 O(1)
.
다음은 링크 된 목록의 클래스 노드입니다.
public class LinkedNode{
public LinkedNode next;
}
다음은 마지막 노드가 두 번째 노드를 가리키는 세 개의 노드로 구성된 간단한 테스트 사례가있는 기본 코드입니다.
public static boolean checkLoopInLinkedList(LinkedNode root){
if (root == null || root.next == null) return false;
LinkedNode current1 = root, current2 = root.next, current3 = root.next.next;
root.next = null;
current2.next = current1;
while(current3 != null){
if(current3 == root) return true;
current1 = current2;
current2 = current3;
current3 = current3.next;
current2.next = current1;
}
return false;
}
다음은 마지막 노드가 두 번째 노드를 가리키는 세 개의 노드에 대한 간단한 테스트 사례입니다.
public class questions{
public static void main(String [] args){
LinkedNode n1 = new LinkedNode();
LinkedNode n2 = new LinkedNode();
LinkedNode n3 = new LinkedNode();
n1.next = n2;
n2.next = n3;
n3.next = n2;
System.out.print(checkLoopInLinkedList(n1));
}
}
finite amount of space and a reasonable amount of time?