这是我的可运行代码。
我所做的是通过使用三个O(1)
跟踪链接的临时节点(空间复杂度)来验证链接列表。
这样做的有趣之处在于,它有助于检测链表中的循环,因为在前进过程中,您不希望返回起始点(根节点),并且其中一个临时节点不应为空,除非您有一个周期,这意味着它指向根节点。
该算法的时间复杂度为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?
:)