Skip to content

Commit 3bba193

Browse files
Merge pull request TheAlgorithms#6 from RianGallagher/master
Added doubly linked list
2 parents f82e46f + a56dc24 commit 3bba193

File tree

2 files changed

+142
-1
lines changed

2 files changed

+142
-1
lines changed

data_structures/DoublyLinkedList.java

Lines changed: 141 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,141 @@
1+
/*
2+
* A linked list is similar to an array, it holds values. However, links in a linked list do not have indexes.
3+
* With a linked list you do not need to predetermine it's size as it grows and shrinks as it is edited.
4+
* This is an example of a double ended, doubly linked list.
5+
* Each link references the next link and the previous one.
6+
*/
7+
class LinkedList{
8+
private Link head; //Head refers to the front of the list
9+
private Link tail; //Tail refers to the back of the list
10+
11+
public LinkedList(){
12+
head = null;
13+
tail = null;
14+
}
15+
16+
public void insertHead(int x){ //Insert an element at the head
17+
Link newLink = new Link(x); //Create a new link with a value attached to it
18+
if(isEmpty()) //Set the first element added to be the tail
19+
tail = newLink;
20+
else
21+
head.previous = newLink; // newLink <-- currenthead(head)
22+
newLink.next = head; // newLink <--> currenthead(head)
23+
head = newLink; // newLink(head) <--> oldhead
24+
}
25+
26+
public void insertTail(int x){
27+
Link newLink = new Link(x);
28+
newLink.next = null; // currentTail(tail) newlink -->
29+
tail.next = newLink; // currentTail(tail) --> newLink -->
30+
newLink.previous = tail; // currentTail(tail) <--> newLink -->
31+
tail = newLink; // oldTail <--> newLink(tail) -->
32+
}
33+
34+
public Link deleteHead(){ //Delete the element at the head
35+
Link temp = head;
36+
head = head.next; // oldHead <--> 2ndElement(head)
37+
head.previous = null; // oldHead --> 2ndElement(head) nothing pointing at old head so will be removed
38+
if(head == null)
39+
tail = null;
40+
return temp;
41+
}
42+
43+
public Link deleteTail(){
44+
Link temp = tail;
45+
tail = tail.previous; // 2ndLast(tail) <--> oldTail --> null
46+
tail.next = null; // 2ndLast(tail) --> null
47+
return temp;
48+
}
49+
50+
public Link delete(int x){
51+
Link current = head;
52+
53+
while(current.value != x) //Find the position to delete
54+
current = current.next;
55+
56+
if(current == head)
57+
deleteHead();
58+
59+
else if(current == tail)
60+
deleteTail();
61+
62+
else{ //Before: 1 <--> 2(current) <--> 3
63+
current.previous.next = current.next; // 1 --> 3
64+
current.next.previous = current.previous; // 1 <--> 3
65+
}
66+
return current;
67+
}
68+
69+
public void insertOrdered(int x){
70+
Link newLink = new Link(x);
71+
Link current = head;
72+
while(current != null && x > current.value) //Find the position to insert
73+
current = current.next;
74+
75+
if(current == head)
76+
insertHead(x);
77+
78+
else if(current == null)
79+
insertTail(x);
80+
81+
else{ //Before: 1 <--> 2(current) <--> 3
82+
newLink.previous = current.previous; // 1 <-- newLink
83+
current.previous.next = newLink; // 1 <--> newLink
84+
newLink.next = current; // 1 <--> newLink --> 2(current) <--> 3
85+
current.previous = newLink; // 1 <--> newLink <--> 2(current) <--> 3
86+
}
87+
}
88+
89+
public boolean isEmpty(){ //Returns true if list is empty
90+
return(head == null);
91+
}
92+
93+
public void display(){ //Prints contents of the list
94+
Link current = head;
95+
while(current!=null){
96+
current.displayLink();
97+
current = current.next;
98+
}
99+
System.out.println();
100+
}
101+
}
102+
103+
class Link{
104+
public int value;
105+
public Link next; //This points to the link in front of the new link
106+
public Link previous; //This points to the link behind the new link
107+
108+
public Link(int value){
109+
this.value = value;
110+
}
111+
112+
public void displayLink(){
113+
System.out.print(value+" ");
114+
}
115+
}
116+
117+
//Example
118+
public class DoublyLinkedList{
119+
public static void main(String args[]){
120+
LinkedList myList = new LinkedList();
121+
122+
myList.insertHead(13);
123+
myList.insertHead(7);
124+
myList.insertHead(10);
125+
myList.display(); // <-- 10(head) <--> 7 <--> 13(tail) -->
126+
127+
myList.insertTail(11);
128+
myList.display(); // <-- 10(head) <--> 7 <--> 13 <--> 11(tail) -->
129+
130+
myList.deleteTail();
131+
myList.display(); // <-- 10(head) <--> 7 <--> 13(tail) -->
132+
133+
myList.delete(7);
134+
myList.display(); // <-- 10(head) <--> 13(tail) -->
135+
136+
myList.insertOrdered(23);
137+
myList.insertOrdered(67);
138+
myList.insertOrdered(3);
139+
myList.display(); // <-- 3(head) <--> 10 <--> 13 <--> 23 <--> 67(tail) -->
140+
}
141+
}

data_structures/LinkedLists.java renamed to data_structures/SinglyLinkedList.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ public void displayLink(){
5050
}
5151

5252
//Example
53-
public class LinkedLists{
53+
public class SinglyLinkedList{
5454
public static void main(String args[]){
5555
LinkedList myList = new LinkedList();
5656

0 commit comments

Comments
 (0)