diff options
| author | Alexander Pickering <alexandermpickering@gmail.com> | 2017-02-06 11:41:36 -0500 |
|---|---|---|
| committer | Alexander Pickering <alexandermpickering@gmail.com> | 2017-02-06 11:41:36 -0500 |
| commit | 89cdf3efb49335e7c07a68a5a64657eeec2288a6 (patch) | |
| tree | cdc0fd8165e65b1637fa54cac11c932acefc8a89 /labs/lab03_dll/DLinkedList.java | |
| download | coe0445-master.tar.gz coe0445-master.tar.bz2 coe0445-master.zip | |
Diffstat (limited to 'labs/lab03_dll/DLinkedList.java')
| -rw-r--r-- | labs/lab03_dll/DLinkedList.java | 190 |
1 files changed, 190 insertions, 0 deletions
diff --git a/labs/lab03_dll/DLinkedList.java b/labs/lab03_dll/DLinkedList.java new file mode 100644 index 0000000..ef0f495 --- /dev/null +++ b/labs/lab03_dll/DLinkedList.java @@ -0,0 +1,190 @@ + +public class DLinkedList<T> +{ + private Node firstNode; + private Node lastNode; + private Node middleNode; + private int numberOfEntries; + private int middlePosition; + + public DLinkedList() + { + firstNode = null; + lastNode = null; + middleNode = null; + numberOfEntries = 0; + middlePosition = 0; + } + + public void add(T newEntry) + { + if(firstNode == null) + { + firstNode = new Node(null, newEntry, null); + lastNode = firstNode; + } + else + { + Node newNode = new Node(lastNode, newEntry, null); + lastNode.next = newNode; + lastNode = newNode; + } + + numberOfEntries++; + + if(numberOfEntries % 2 == 1) + { + if(middleNode == null) + { + middleNode = firstNode; + } + else + { + middleNode = middleNode.next; + } + middlePosition++; + } + } + + public T getEntry(int givenPosition) + { + T result = null; + + if((givenPosition >= 1) && (givenPosition <= numberOfEntries)) + { + result = (getNodeAt(givenPosition)).data; + } + + return result; + } + + private Node getNodeAt(int givenPosition) + { + Node currentNode = firstNode; + + for(int counter = 1; counter < givenPosition; counter++) + { + currentNode = currentNode.next; + } + + return currentNode; + } + + public T getEntry1(int givenPosition) + { + T result = null; + + if((givenPosition >= 1) && (givenPosition <= numberOfEntries)) + { + result = (getNodeAt1(givenPosition)).data; + } + + return result; + } + + /** + * Modify this method according to the Solution 1 + */ + private Node getNodeAt1(int givenPosition) + { + if(givenPosition > middlePosition) + { + //start from end, go backwars + Node temp = lastNode; + for(int i = 0;i<numberOfEntries - givenPosition;i++) + { + temp = temp.previous; + } + return temp; + } + else + { + //start from front, forwards + Node temp = firstNode; + for(int i = 1; i < givenPosition;i++) + { + temp = temp.next; + } + return temp; + } + } + + public T getEntry2(int givenPosition) + { + T result = null; + + if((givenPosition >= 1) && (givenPosition <= numberOfEntries)) + { + result = (getNodeAt2(givenPosition)).data; + } + + return result; + } + + /** + * Modify this method according to the Solution 2 + */ + private Node getNodeAt2(int givenPosition) + { + if(givenPosition < middlePosition) + { + if(givenPosition < middlePosition/2) + { + //STart from the front, go forwards + Node temp = firstNode; + for(int i = 1;i < givenPosition;i++) + { + temp = temp.next; + } + return temp; + } + else + { + //Start from the middle, backwards + Node temp = middleNode; + for(int i = middlePosition; i > givenPosition;i--) + { + temp = temp.previous; + } + return temp; + } + } + else + { + if(givenPosition < numberOfEntries*(3.0/4)) + { + //Start from the middle, go forwards + Node temp = middleNode; + for(int i = middlePosition; i < givenPosition; i++) + { + temp = temp.next; + } + return temp; + } + else + { + //Start from the end, go backwards + Node temp = lastNode; + for(int i = numberOfEntries; i >givenPosition; i--) + { + temp = temp.previous; + } + return temp; + } + } + } + + private class Node + { + private Node previous; + private T data; + private Node next; + + private Node(Node previousNode, T aData, Node nextNode) + { + previous = previousNode; + data = aData; + next = nextNode; + } + } +} |
