Đây là mã runnable của tôi.
Những gì tôi đã làm là hoàn nguyên danh sách được liên kết bằng cách sử dụng ba nút tạm thời (độ phức tạp không gian O(1)
) để theo dõi các liên kết.
Thực tế thú vị khi thực hiện là giúp phát hiện chu trình trong danh sách được liên kết bởi vì khi bạn tiếp tục, bạn không mong đợi quay lại điểm bắt đầu (nút gốc) và một trong các nút tạm thời sẽ chuyển sang null trừ khi bạn có một chu kỳ có nghĩa là nó trỏ đến nút gốc.
Độ phức tạp thời gian của thuật toán này là O(n)
và độ phức tạp không gian là O(1)
.
Đây là nút lớp cho danh sách được liên kết:
public class LinkedNode{
public LinkedNode next;
}
Đây là mã chính với trường hợp kiểm tra đơn giản gồm ba nút mà nút cuối cùng trỏ đến nút thứ hai:
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;
}
Đây là trường hợp thử nghiệm đơn giản gồm ba nút mà nút cuối cùng trỏ đến nút thứ hai:
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?
:)