1
+ public class DoublyCircularLL {
2
+ static class Node {
3
+ private Node prev ;
4
+ private Node next ;
5
+ private int data ;
6
+
7
+ Node (int data ) {
8
+ this .data = data ;
9
+ }
10
+ }
11
+
12
+ Node head = null ;
13
+ Node tail = null ;
14
+ private int size ;
15
+
16
+ void addEmpty (int data ) {
17
+ Node node = new Node (data );
18
+ head = tail = node ;
19
+ node .prev = head ;
20
+ node .next = head ;
21
+ size ++;
22
+ }
23
+
24
+ void addFront (int data ) {
25
+ Node node = new Node (data );
26
+ if (head == null ) {
27
+ addEmpty (data );
28
+ } else {
29
+ node .next = head ;
30
+ tail .next = node ;
31
+ node .prev = tail ;
32
+ head = node ;
33
+ size ++;
34
+ }
35
+ }
36
+
37
+ void addEnd (int data ) {
38
+ Node node = new Node (data );
39
+ if (tail == null ) {
40
+ addEmpty (data );
41
+ return ;
42
+ }
43
+ tail .next = node ;
44
+ node .prev = tail ;
45
+ node .next = head ;
46
+ head .prev = node ;
47
+ tail = node ;
48
+ size ++;
49
+ }
50
+
51
+ void addAt (int data , int index ) {
52
+ Node getNode = get (index );
53
+ Node node = new Node (data );
54
+ if (index < 0 || index >= size ) {
55
+ System .out .println ("index: " + index + " is out of bound!" );
56
+ return ;
57
+ }
58
+ if (index == 0 ) {
59
+ addFront (data );
60
+ return ;
61
+ }
62
+ if (index == size - 1 ) {
63
+ addEnd (data );
64
+ return ;
65
+ }
66
+ node .next = getNode .next ;
67
+ node .prev = getNode ;
68
+ getNode .next .prev = node ;
69
+ getNode .next = node ;
70
+ size ++;
71
+ }
72
+
73
+ Node get (int index ) {
74
+ Node temp = head ;
75
+ if (index < 0 || index >= size ) {
76
+ return null ;
77
+ }
78
+ for (int i = 0 ; i < index ; i ++) {
79
+ temp = temp .next ;
80
+ }
81
+ return temp ;
82
+ }
83
+
84
+ Node search (int item ) {
85
+ Node temp = head ;
86
+ while (temp != null ) {
87
+ if (temp .data == item ) {
88
+ return temp ;
89
+ }
90
+ temp = temp .next ;
91
+ if (temp == head ) {
92
+ break ;
93
+ }
94
+ }
95
+ return null ;
96
+ }
97
+
98
+ int size () {
99
+ return size ;
100
+ }
101
+
102
+ void removeFirst () {
103
+ if (head == tail ) {
104
+ head = tail = null ;
105
+ return ;
106
+ }
107
+ head = head .next ;
108
+ head .prev = tail ;
109
+ tail .next = head ;
110
+ size --;
111
+ }
112
+
113
+ void removeLast () {
114
+ if (head == tail ) {
115
+ head = tail = null ;
116
+ return ;
117
+ }
118
+ tail = tail .prev ;
119
+ tail .next = head ;
120
+ head .prev = tail ;
121
+ size --;
122
+ }
123
+
124
+ void deleteNode (int item ) {
125
+ Node getNode = search (item );
126
+ if (getNode == head ) {
127
+ removeFirst ();
128
+ return ;
129
+ }
130
+ if (getNode == tail ) {
131
+ removeLast ();
132
+ return ;
133
+ }
134
+ getNode .prev .next = getNode .next ;
135
+ getNode .next .prev = getNode .prev ;
136
+ getNode = null ;
137
+ size --;
138
+ }
139
+
140
+ void display () {
141
+ Node temp = head ;
142
+ if (head == null ) {
143
+ System .out .println ("list is empty!" );
144
+ return ;
145
+ }
146
+ do {
147
+ System .out .print (temp .data + "-> " );
148
+ temp = temp .next ;
149
+ } while (temp != head );
150
+ System .out .println ("NULL" + " size: " + size ());
151
+ }
152
+
153
+ public static void main (String [] args ) {
154
+ DoublyCircularLL list = new DoublyCircularLL ();
155
+ list .addFront (15 );
156
+ list .addFront (19 );
157
+ list .addEnd (48 );
158
+ list .addEnd (57 );
159
+ list .display ();
160
+ list .addAt (69 , 4 );
161
+ list .display ();
162
+ }
163
+ }
0 commit comments