27 iunie 2023

Xor Linked List

O listă simplu-înlănțuită cu proprietăți de dublu-înlănțuită, care are nevoie de un singur pointer în loc de doi. 

Sună frumos în teorie, dar este inaplicabil în Java. De fapt, este o aplicație pur teoretică întrucât memoria nu mai este o problemă acum, fiind foarte ieftină. De asemenea, nu te scutește de parcurgerea întregii liste, la fel ca listele simplu-înlănțuite. Pe scurt, brain fuck for no reason, mai jos este o tentativă de implementare (netestată, pentru că... Java):

Notă: getPrev și getNext au nevoie de nodul următor respectiv anterior pentru a-și îndeplini funcția, ceea ce presupune că ai parcurs lista înainte. Doar oleacă mai flexibil, merită oare? Sau îmi scapă ceva?


public class MemEffLinkdListTest {
Node head;

/* Xor Linked List */

private void initList(int length) {
if (length < 1) {
throw new MyBusinessException("Invalid length!");
}

head = new Node("A0");
Node prev = null;
Node current = head;

for (int i = 1; i < length; i++) {
Node next = new Node("A" + i);
Node ptr = prev ^ next; // not possible in Java, we don't have access to memory addresses
current.setPtr(ptr);

prev = current;
current = next;
}
}

private Node getNext(Node current, Node prev) {
return current ^ prev; // not possible in Java
}

private Node getPrev(Node current, Node next) {
return current ^ next; // not possible in Java
}

private class Node {
private String data;
private Node ptr;

public Node(String data) {
this.data = data;
this.ptr = null;
}

public void setPtr(Node ptr) {
this.ptr = ptr;
}

public Node getPtr() {
return ptr;
}

public String getData() {
return data;
}
}
}