นี่คือรหัสที่รันได้ของฉัน
สิ่งที่ฉันทำคือการเคารพรายการเชื่อมโยงโดยใช้สามโหนดชั่วคราว (ความซับซ้อนของพื้นที่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?
:)