import
java.util.*;
public
class
GFG {
class
Node {
int
data;
Node prev;
Node next;
Node top;
Node(
int
data)
{
this
.data = data;
prev =
null
;
next =
null
;
top =
null
;
}
}
Node head =
null
, tail =
null
;
int
node_count =
0
;
public
void
insert(
int
new_data)
{
Node new_node =
new
Node(new_data);
Node curr_node =
null
;
if
(node_count ==
0
) {
tail = new_node;
head = new_node;
curr_node = head;
curr_node.next =
null
;
curr_node.prev =
null
;
curr_node.top =
null
;
node_count++;
}
else
{
curr_node = head;
if
(new_node.data < curr_node.data) {
new_node.next = curr_node;
curr_node.prev = new_node;
new_node.prev =
null
;
head = new_node;
curr_node = head;
do
{
curr_node = curr_node.next;
}
while
(curr_node.next !=
null
);
tail = curr_node;
}
else
{
Node last_node = curr_node;
while
(curr_node !=
null
&& new_node.data > curr_node.data) {
last_node = curr_node;
curr_node = curr_node.next;
if
(curr_node ==
null
) {
last_node.next = new_node;
new_node.prev = last_node;
new_node.next =
null
;
tail = new_node;
break
;
}
else
if
(new_node.data
<= curr_node.data) {
if
(new_node.data
< curr_node.data) {
last_node.next = new_node;
new_node.prev = last_node;
new_node.next = curr_node;
curr_node.prev = new_node;
if
(curr_node.next !=
null
) {
do
{
curr_node
= curr_node.next;
}
while
(curr_node.next
!=
null
);
}
tail = curr_node;
break
;
}
else
if
(curr_node.data
== new_node.data) {
last_node = curr_node;
while
(last_node.top !=
null
) {
last_node = last_node.top;
}
last_node.top = new_node;
new_node.top =
null
;
break
;
}
}
}
}
}
}
public
void
traverse_head()
{
Node node = head;
Node curr =
null
;
while
(node !=
null
) {
System.out.print(node.data +
"\t"
);
curr = node;
while
(curr.top !=
null
) {
curr = curr.top;
System.out.print(
"top->"
+ curr.data
+
"\t"
);
}
node = node.next;
}
System.out.println();
}
public
void
traverse_tail()
{
Node node = tail;
Node curr =
null
;
while
(node !=
null
) {
System.out.print(node.data +
"\t"
);
curr = node;
while
(curr.top !=
null
) {
curr = curr.top;
System.out.print(
"top->"
+ curr.data
+
"\t"
);
}
node = node.prev;
}
System.out.println();
}
public
static
void
main(String args[])
{
GFG tll =
new
GFG();
tll.insert(
7
);
tll.insert(
9
);
tll.insert(
1
);
tll.insert(
5
);
tll.insert(
7
);
System.out.println(
"\nTraversing Linked List head: "
);
tll.traverse_head();
System.out.println(
"\nTraversing Linked List tail: "
);
tll.traverse_tail();
}
}