Skip to content

Commit c3dd17a

Browse files
committed
added DoubleCircularLinkedList.java file
1 parent 48a241c commit c3dd17a

File tree

1 file changed

+101
-0
lines changed

1 file changed

+101
-0
lines changed
Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
package com.thealgorithms.datastructures.lists;
2+
3+
public class DoubleCircularLinkedList<E> {
4+
5+
private static final class Node<E> {
6+
Node<E> next;
7+
Node<E> previous;
8+
E value;
9+
10+
private Node(E value, Node<E> next) {
11+
this.value = value;
12+
this.next = next;
13+
}
14+
}
15+
16+
private int size;
17+
private Node<E> head = null;
18+
private Node<E> tail = null; // keeping a tail pointer to keep track of the end of the list
19+
20+
public DoubleCircularLinkedList() {
21+
// creation of the dummy node
22+
head = new Node<>(null, null);
23+
tail = head; // Initially, head and tail point to the dummy node
24+
head.next = head; // Circular reference to itself
25+
size = 0;
26+
}
27+
28+
public int getSize() {
29+
return size;
30+
}
31+
32+
public void append(E value) {
33+
if (value == null) {
34+
throw new NullPointerException("Cannot add null element to the list");
35+
}
36+
37+
Node<E> newNode = new Node<>(value, head); // Create new node pointing to head
38+
if (size == 0) {
39+
head.next = newNode; // Update head's next to point to the new node
40+
newNode.previous = head; // Update the new node's previous to point to head
41+
tail = newNode; // Update tail to the new node
42+
} else {
43+
tail.next = newNode; // Previous tail points to the new node
44+
newNode.previous = tail;
45+
tail = newNode;
46+
head.previous = tail;
47+
}
48+
size++;
49+
}
50+
@Override
51+
public String toString() {
52+
if (size == 0) {
53+
return "[]";
54+
}
55+
StringBuilder sb = new StringBuilder("[ ");
56+
57+
Node<E> current = head.next;
58+
while (current != head) {
59+
sb.append(current.value);
60+
if (current.next != head) {
61+
sb.append(", ");
62+
}
63+
current = current.next;
64+
}
65+
sb.append(" ]");
66+
return sb.toString();}
67+
68+
public E remove(int pos) {
69+
if (pos >= size || pos < 0) {
70+
throw new IndexOutOfBoundsException("Position cannot be greater than size or negative");
71+
}
72+
73+
Node<E> before = head;
74+
for (int i = 0; i < pos; i++) {
75+
before = before.next; // Move to the node before the one to be removed
76+
}
77+
78+
Node<E> destroy = before.next; // Node to be removed
79+
E saved = destroy.value; // Save the value to return
80+
81+
before.next = destroy.next; // Bypass the node to be removed
82+
destroy.next.previous = before;
83+
84+
if (destroy == tail) { // If the tail is being removed
85+
tail = before; // Update the tail
86+
}
87+
88+
size--;
89+
return saved; // Return the removed value
90+
}
91+
92+
public static void main(String[] args)
93+
{
94+
DoubleCircularLinkedList<String> k = new DoubleCircularLinkedList<>();
95+
k.append("khalid");
96+
k.append("fahad");
97+
k.append("nora");
98+
System.out.println(k.getSize());
99+
System.out.println(k.toString());
100+
}
101+
}

0 commit comments

Comments
 (0)