public static void demoMyLinkedHashMap() {
SimpleLinkedList map = new SimpleLinkedList<>();
map.add(1);
map.add(2);
map.add(3);
map.add(4);
map.printAll();
map.print(1);
map.print(4);
map.print(9);
map.add(5);
map.printAll();
map.print(5);
map.insert(0, 1);
map.printAll();
map.print(5);
map.insert(0, 1);
map.insert(6, 6);
map.printAll();
map.print_last();
map.reverse();
map.printAll();
map.print_last();
map.reverse();
map.printAll();
map.print_last();
map.add(7);
map.printAll();
map.print_last();
}
package exercises;
public class SimpleLinkedList {
private class Node {
private T data = null;
private Node prev = null;
private Node next = null;
public Node(T data) {
this.setData(data);
this.setPrev(null);
this.setNext(null);
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
public Node getPrev() {
return prev;
}
public void setPrev(Node prev) {
this.prev = prev;
}
public Node getNext() {
return next;
}
public void setNext(Node next) {
this.next = next;
}
}
private Node root;
private Node current;
public void add(T data) {
if(this.root == null) {
this.root = new Node(data);
this.current = this.root;
return;
} else {
Node node = new Node(data);
node.setPrev(current);
current.setNext(node);
current = node;
}
}
/**
* ignore, will not promote node
* @param data
* @param position
*/
public void insert(T data, int position) {
Node pointer = this.getNode(position, false);
if(pointer == null || pointer.getData().equals(data)) {
System.out.println("Same data, Ignore");
return;
}
Node newNode = new Node(data);
newNode.setNext(pointer);
newNode.setPrev(pointer.getPrev());
pointer.setPrev(newNode);
if(newNode.getPrev() != null) {
newNode.getPrev().setNext(newNode);
} else {
root = newNode;
}
}
public T get(int position) {
Node pointer = this.getNode(position, true);
return (pointer == null) ? null : pointer.getData();
}
public void printAll() {
if(this.root == null) return;
for(Node pointer = root; pointer != null; pointer = pointer.getNext()) {
System.out.print(pointer.getData().toString());
if(pointer.getNext() != null) System.out.print("->");
else System.out.print("\n");
}
}
public void print(int position) {
if(this.root == null) return;
T pointer = this.get(position);
if(pointer == null) return;
System.out.println("Item at position : " + position + " is " + pointer.toString());
}
public void print_last() {
System.out.println("Last item is : " + current.getData().toString());
}
/**
* reverse relies on single recursion. method returns processed node
* Recursively traverse to end to make it 'root'. return r'oot'
* current next is its prev. its prev is returned processed node. return current
*/
public void reverse() {
if(this.root == this.current) return;
current = this.reverse(root);
}
private Node reverse(Node current) {
if(current.getNext() == null) {
root = current;
root.setNext(root.getPrev()); //Root next, should be its previous.
root.setPrev(null); //Root node previous should be null
return current;
}
Node prev = reverse(current.getNext()); //prev, last visited node
current.setNext(current.getPrev()); //curent.next should be its prev node
current.setPrev(prev); //current.prev should be last visited node
return current;
}
private void promote(Node accessed) {
if(accessed == null || accessed == current) return;
if(accessed.getPrev() != null) {
accessed.getPrev().setNext(accessed.getNext()); //previous node should point accessed's next
accessed.getNext().setPrev(accessed.getPrev());
} else {
root = accessed.getNext(); // accessed.prev is null only if its root node, so new root is accessed's next
root.setPrev(null); //root prev is always null;
}
current.setNext(accessed);
accessed.setPrev(current);
accessed.setNext(null);
current = accessed;
}
/**
* 1. Return NULL, If the root is null or position is invalid
* 2. While index < position && pointer != null
* move to pointer.next
* increment index
* @param position
* @param promote - to promote the node to front
* @return
*/
private Node getNode(int position, boolean promote) {
if(position <= 0) return null;
int index = 1;
Node pointer = root;
while(index < position && pointer != null) {
pointer = pointer.getNext();
index++;
}
if(promote && pointer != null) promote(pointer);
return pointer;
}
}
public class SimpleLinkedList
private class Node {
private T data = null;
private Node prev = null;
private Node next = null;
public Node(T data) {
this.setData(data);
this.setPrev(null);
this.setNext(null);
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
public Node getPrev() {
return prev;
}
public void setPrev(Node prev) {
this.prev = prev;
}
public Node getNext() {
return next;
}
public void setNext(Node next) {
this.next = next;
}
}
private Node root;
private Node current;
public void add(T data) {
if(this.root == null) {
this.root = new Node(data);
this.current = this.root;
return;
} else {
Node node = new Node(data);
node.setPrev(current);
current.setNext(node);
current = node;
}
}
/**
* ignore, will not promote node
* @param data
* @param position
*/
public void insert(T data, int position) {
Node pointer = this.getNode(position, false);
if(pointer == null || pointer.getData().equals(data)) {
System.out.println("Same data, Ignore");
return;
}
Node newNode = new Node(data);
newNode.setNext(pointer);
newNode.setPrev(pointer.getPrev());
pointer.setPrev(newNode);
if(newNode.getPrev() != null) {
newNode.getPrev().setNext(newNode);
} else {
root = newNode;
}
}
public T get(int position) {
Node pointer = this.getNode(position, true);
return (pointer == null) ? null : pointer.getData();
}
public void printAll() {
if(this.root == null) return;
for(Node pointer = root; pointer != null; pointer = pointer.getNext()) {
System.out.print(pointer.getData().toString());
if(pointer.getNext() != null) System.out.print("->");
else System.out.print("\n");
}
}
public void print(int position) {
if(this.root == null) return;
T pointer = this.get(position);
if(pointer == null) return;
System.out.println("Item at position : " + position + " is " + pointer.toString());
}
public void print_last() {
System.out.println("Last item is : " + current.getData().toString());
}
/**
* reverse relies on single recursion. method returns processed node
* Recursively traverse to end to make it 'root'. return r'oot'
* current next is its prev. its prev is returned processed node. return current
*/
public void reverse() {
if(this.root == this.current) return;
current = this.reverse(root);
}
private Node reverse(Node current) {
if(current.getNext() == null) {
root = current;
root.setNext(root.getPrev()); //Root next, should be its previous.
root.setPrev(null); //Root node previous should be null
return current;
}
Node prev = reverse(current.getNext()); //prev, last visited node
current.setNext(current.getPrev()); //curent.next should be its prev node
current.setPrev(prev); //current.prev should be last visited node
return current;
}
private void promote(Node accessed) {
if(accessed == null || accessed == current) return;
if(accessed.getPrev() != null) {
accessed.getPrev().setNext(accessed.getNext()); //previous node should point accessed's next
accessed.getNext().setPrev(accessed.getPrev());
} else {
root = accessed.getNext(); // accessed.prev is null only if its root node, so new root is accessed's next
root.setPrev(null); //root prev is always null;
}
current.setNext(accessed);
accessed.setPrev(current);
accessed.setNext(null);
current = accessed;
}
/**
* 1. Return NULL, If the root is null or position is invalid
* 2. While index < position && pointer != null
* move to pointer.next
* increment index
* @param position
* @param promote - to promote the node to front
* @return
*/
private Node getNode(int position, boolean promote) {
if(position <= 0) return null;
int index = 1;
Node pointer = root;
while(index < position && pointer != null) {
pointer = pointer.getNext();
index++;
}
if(promote && pointer != null) promote(pointer);
return pointer;
}
}
No comments:
Post a Comment