From ece940b655a2af1992a8851d3ed2b694879c22ae Mon Sep 17 00:00:00 2001 From: Pratham Gupta Date: Sat, 16 Mar 2019 13:05:26 +0530 Subject: [PATCH 1/2] Updated DoublyLinkedList.java Changes made in Insert and Delete functions. --- DataStructures/Lists/DoublyLinkedList.java | 24 ++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/DataStructures/Lists/DoublyLinkedList.java b/DataStructures/Lists/DoublyLinkedList.java index 27c1a1a24580..bfc6f96a40bc 100644 --- a/DataStructures/Lists/DoublyLinkedList.java +++ b/DataStructures/Lists/DoublyLinkedList.java @@ -1,3 +1,4 @@ + /** * This class implements a DoublyLinkedList. This is done using the classes * LinkedList and Link. @@ -62,9 +63,15 @@ public void insertHead(int x){ public void insertTail(int x){ Link newLink = new Link(x); newLink.next = null; // currentTail(tail) newlink --> - tail.next = newLink; // currentTail(tail) --> newLink --> - newLink.previous = tail; // currentTail(tail) <--> newLink --> - tail = newLink; // oldTail <--> newLink(tail) --> + if(isEmpty()) { // Check if there are no elements in list then it adds first element + tail=newLink; + head=tail; + } + else { + tail.next = newLink; // currentTail(tail) --> newLink --> + newLink.previous = tail; // currentTail(tail) <--> newLink --> + tail = newLink; // oldTail <--> newLink(tail) --> + } } /** @@ -72,12 +79,13 @@ public void insertTail(int x){ * * @return The new head */ - public void deleteHead(){ + public Link deleteHead(){ Link temp = head; head = head.next; // oldHead <--> 2ndElement(head) head.previous = null; // oldHead --> 2ndElement(head) nothing pointing at old head so will be removed if(head == null) tail = null; + return temp; } /** @@ -85,11 +93,15 @@ public void deleteHead(){ * * @return The new tail */ - public void deleteTail(){ + public Link deleteTail(){ Link temp = tail; tail = tail.previous; // 2ndLast(tail) <--> oldTail --> null tail.next = null; // 2ndLast(tail) --> null - + if(tail==null) + { + head=null; + } + return temp; } /** From 14974872fd87ed51a89a2949480309f078d32626 Mon Sep 17 00:00:00 2001 From: Libin Yang Date: Sat, 23 Mar 2019 15:43:38 +0800 Subject: [PATCH 2/2] Update DoublyLinkedList.java --- DataStructures/Lists/DoublyLinkedList.java | 440 +++++++++++---------- 1 file changed, 223 insertions(+), 217 deletions(-) diff --git a/DataStructures/Lists/DoublyLinkedList.java b/DataStructures/Lists/DoublyLinkedList.java index bfc6f96a40bc..f66c77ddf7eb 100644 --- a/DataStructures/Lists/DoublyLinkedList.java +++ b/DataStructures/Lists/DoublyLinkedList.java @@ -2,235 +2,241 @@ /** * This class implements a DoublyLinkedList. This is done using the classes * LinkedList and Link. - * - * A linked list is simplar to an array, it holds values. However, - * links in a linked list do not have indees. With a linked list + *

+ * A linked list is similar to an array, it holds values. However, + * links in a linked list do not have indexes. With a linked list * you do not need to predetermine it's size as it grows and shrinks * as it is edited. This is an example of a double ended, doubly * linked list. Each link references the next link and the previous * one. - * - * @author Unknown * + * @author Unknown */ -class DoublyLinkedList{ - /** Head refers to the front of the list */ - private Link head; - /** Tail refers to the back of the list */ - private Link tail; - - /** - * Default Constructor - */ - public DoublyLinkedList(){ - head = null; - tail = null; - } - - /** - * Constructs a list containing the elements of the array - * @param array the array whose elements are to be placed into this list - * @throws NullPointerException if the specified collection is null - */ - public DoublyLinkedList(int[] array){ - if (array == null) throw new NullPointerException(); - for (int i:array) { - insertTail(i); - } - } - - /** - * Insert an element at the head - * - * @param x Element to be inserted - */ - public void insertHead(int x){ - Link newLink = new Link(x); //Create a new link with a value attached to it - if(isEmpty()) //Set the first element added to be the tail - tail = newLink; - else - head.previous = newLink; // newLink <-- currenthead(head) - newLink.next = head; // newLink <--> currenthead(head) - head = newLink; // newLink(head) <--> oldhead - } - - /** - * Insert an element at the tail - * - * @param x Element to be inserted - */ - public void insertTail(int x){ - Link newLink = new Link(x); - newLink.next = null; // currentTail(tail) newlink --> - if(isEmpty()) { // Check if there are no elements in list then it adds first element - tail=newLink; - head=tail; - } - else { - tail.next = newLink; // currentTail(tail) --> newLink --> - newLink.previous = tail; // currentTail(tail) <--> newLink --> - tail = newLink; // oldTail <--> newLink(tail) --> - } - } - - /** - * Delete the element at the head - * - * @return The new head - */ - public Link deleteHead(){ - Link temp = head; - head = head.next; // oldHead <--> 2ndElement(head) - head.previous = null; // oldHead --> 2ndElement(head) nothing pointing at old head so will be removed - if(head == null) - tail = null; - return temp; - } - - /** - * Delete the element at the tail - * - * @return The new tail - */ - public Link deleteTail(){ - Link temp = tail; - tail = tail.previous; // 2ndLast(tail) <--> oldTail --> null - tail.next = null; // 2ndLast(tail) --> null - if(tail==null) - { - head=null; - } - return temp; - } - - /** - * Delete the element from somewhere in the list - * - * @param x element to be deleted - * @return Link deleted - */ - public void delete(int x){ - Link current = head; - - while(current.value != x) //Find the position to delete - current = current.next; - - if(current == head) - deleteHead(); - - else if(current == tail) - deleteTail(); - - else{ //Before: 1 <--> 2(current) <--> 3 - current.previous.next = current.next; // 1 --> 3 - current.next.previous = current.previous; // 1 <--> 3 - } - } - - /** - * Inserts element and reorders - * - * @param x Element to be added - */ - public void insertOrdered(int x){ - Link newLink = new Link(x); - Link current = head; - while(current != null && x > current.value) //Find the position to insert - current = current.next; - - if(current == head) - insertHead(x); - - else if(current == null) - insertTail(x); - - else{ //Before: 1 <--> 2(current) <--> 3 - newLink.previous = current.previous; // 1 <-- newLink - current.previous.next = newLink; // 1 <--> newLink - newLink.next = current; // 1 <--> newLink --> 2(current) <--> 3 - current.previous = newLink; // 1 <--> newLink <--> 2(current) <--> 3 - } - } - - /** - * Returns true if list is empty - * - * @return true if list is empty - */ - public boolean isEmpty(){ - return(head == null); - } - - /** - * Prints contents of the list - */ - public void display(){ //Prints contents of the list - Link current = head; - while(current!=null){ - current.displayLink(); - current = current.next; - } - System.out.println(); - } +class DoublyLinkedList { + /** + * Head refers to the front of the list + */ + private Link head; + /** + * Tail refers to the back of the list + */ + private Link tail; + + /** + * Default Constructor + */ + public DoublyLinkedList() { + head = null; + tail = null; + } + + /** + * Constructs a list containing the elements of the array + * + * @param array the array whose elements are to be placed into this list + * @throws NullPointerException if the specified collection is null + */ + public DoublyLinkedList(int[] array) { + if (array == null) throw new NullPointerException(); + for (int i : array) { + insertTail(i); + } + } + + /** + * Insert an element at the head + * + * @param x Element to be inserted + */ + public void insertHead(int x) { + Link newLink = new Link(x); // Create a new link with a value attached to it + if (isEmpty()) // Set the first element added to be the tail + tail = newLink; + else + head.previous = newLink; // newLink <-- currenthead(head) + newLink.next = head; // newLink <--> currenthead(head) + head = newLink; // newLink(head) <--> oldhead + } + + /** + * Insert an element at the tail + * + * @param x Element to be inserted + */ + public void insertTail(int x) { + Link newLink = new Link(x); + newLink.next = null; // currentTail(tail) newlink --> + if (isEmpty()) { // Check if there are no elements in list then it adds first element + tail = newLink; + head = tail; + } else { + tail.next = newLink; // currentTail(tail) --> newLink --> + newLink.previous = tail; // currentTail(tail) <--> newLink --> + tail = newLink; // oldTail <--> newLink(tail) --> + } + } + + /** + * Delete the element at the head + * + * @return The new head + */ + public Link deleteHead() { + Link temp = head; + head = head.next; // oldHead <--> 2ndElement(head) + head.previous = null; // oldHead --> 2ndElement(head) nothing pointing at old head so will be removed + if (head == null) + tail = null; + return temp; + } + + /** + * Delete the element at the tail + * + * @return The new tail + */ + public Link deleteTail() { + Link temp = tail; + tail = tail.previous; // 2ndLast(tail) <--> oldTail --> null + tail.next = null; // 2ndLast(tail) --> null + if (tail == null) { + head = null; + } + return temp; + } + + /** + * Delete the element from somewhere in the list + * + * @param x element to be deleted + * @return Link deleted + */ + public void delete(int x) { + Link current = head; + + while (current.value != x) // Find the position to delete + current = current.next; + + if (current == head) + deleteHead(); + + else if (current == tail) + deleteTail(); + + else { // Before: 1 <--> 2(current) <--> 3 + current.previous.next = current.next; // 1 --> 3 + current.next.previous = current.previous; // 1 <--> 3 + } + } + + /** + * Inserts element and reorders + * + * @param x Element to be added + */ + public void insertOrdered(int x) { + Link newLink = new Link(x); + Link current = head; + while (current != null && x > current.value) // Find the position to insert + current = current.next; + + if (current == head) + insertHead(x); + + else if (current == null) + insertTail(x); + + else { // Before: 1 <--> 2(current) <--> 3 + newLink.previous = current.previous; // 1 <-- newLink + current.previous.next = newLink; // 1 <--> newLink + newLink.next = current; // 1 <--> newLink --> 2(current) <--> 3 + current.previous = newLink; // 1 <--> newLink <--> 2(current) <--> 3 + } + } + + /** + * Returns true if list is empty + * + * @return true if list is empty + */ + public boolean isEmpty() { + return (head == null); + } + + /** + * Prints contents of the list + */ + public void display() { // Prints contents of the list + Link current = head; + while (current != null) { + current.displayLink(); + current = current.next; + } + System.out.println(); + } } /** * This class is used to implement the nodes of the * linked list. - * - * @author Unknown * + * @author Unknown */ -class Link{ - /** Value of node */ - public int value; - /** This points to the link in front of the new link */ - public Link next; - /** This points to the link behind the new link */ - public Link previous; - - /** - * Constructor - * - * @param value Value of node - */ - public Link(int value){ - this.value = value; - } - - /** - * Displays the node - */ - public void displayLink(){ - System.out.print(value+" "); - } - - /** - * Main Method - * - * @param args Command line arguments - */ - public static void main(String args[]){ - DoublyLinkedList myList = new DoublyLinkedList(); - - myList.insertHead(13); - myList.insertHead(7); - myList.insertHead(10); - myList.display(); // <-- 10(head) <--> 7 <--> 13(tail) --> - - myList.insertTail(11); - myList.display(); // <-- 10(head) <--> 7 <--> 13 <--> 11(tail) --> - - myList.deleteTail(); - myList.display(); // <-- 10(head) <--> 7 <--> 13(tail) --> - - myList.delete(7); - myList.display(); // <-- 10(head) <--> 13(tail) --> - - myList.insertOrdered(23); - myList.insertOrdered(67); - myList.insertOrdered(3); - myList.display(); // <-- 3(head) <--> 10 <--> 13 <--> 23 <--> 67(tail) --> - } +class Link { + /** + * Value of node + */ + public int value; + /** + * This points to the link in front of the new link + */ + public Link next; + /** + * This points to the link behind the new link + */ + public Link previous; + + /** + * Constructor + * + * @param value Value of node + */ + public Link(int value) { + this.value = value; + } + + /** + * Displays the node + */ + public void displayLink() { + System.out.print(value + " "); + } + + /** + * Main Method + * + * @param args Command line arguments + */ + public static void main(String args[]) { + DoublyLinkedList myList = new DoublyLinkedList(); + myList.insertHead(13); + myList.insertHead(7); + myList.insertHead(10); + myList.display(); // <-- 10(head) <--> 7 <--> 13(tail) --> + + myList.insertTail(11); + myList.display(); // <-- 10(head) <--> 7 <--> 13 <--> 11(tail) --> + + myList.deleteTail(); + myList.display(); // <-- 10(head) <--> 7 <--> 13(tail) --> + + myList.delete(7); + myList.display(); // <-- 10(head) <--> 13(tail) --> + + myList.insertOrdered(23); + myList.insertOrdered(67); + myList.insertOrdered(3); + myList.display(); // <-- 3(head) <--> 10 <--> 13 <--> 23 <--> 67(tail) --> + } }