import
java.util.HashMap;
class
Node {
int
data;
int
link;
Node(
int
data) {
this
.data = data;
this
.link =
0
;
}
}
class
XorLinkedList {
Node head;
HashMap<Integer, Node> nodes;
XorLinkedList() {
head =
null
;
nodes =
new
HashMap<>();
}
private
int
XOR(
int
a,
int
b,
int
c) {
return
a ^ b ^ c;
}
void
forwardTraversal() {
if
(head ==
null
) {
System.out.println(
"Empty"
);
}
else
{
int
prevId =
0
;
Node current = head;
System.out.print(current.data +
" "
);
int
nextId =
1
;
while
(nextId !=
0
) {
nextId = XOR(prevId, current.link,
0
);
if
(nextId !=
0
) {
prevId = System.identityHashCode(current);
current = typeCast(nextId);
System.out.print(current.data +
" "
);
}
}
}
}
void
insertAtPosition(
int
key,
int
position) {
if
(position <
1
) {
System.out.println(
"Can't insert"
);
}
else
if
(position ==
1
) {
Node newNode =
new
Node(key);
if
(head ==
null
) {
head = newNode;
}
else
{
head.link = XOR(System.identityHashCode(newNode), head.link,
0
);
newNode.link = System.identityHashCode(head);
head = newNode;
}
nodes.put(System.identityHashCode(newNode), newNode);
}
else
{
if
(head ==
null
) {
System.out.println(
"Out of range"
);
}
else
{
Node newNode =
new
Node(key);
Node current = head;
int
currentId = System.identityHashCode(current);
int
i =
1
;
int
prevId =
0
;
int
nextId =
1
;
while
(nextId !=
0
&& i < position -
1
) {
nextId = XOR(prevId, current.link,
0
);
prevId = System.identityHashCode(current);
if
(nextId !=
0
) {
current = typeCast(nextId);
currentId = System.identityHashCode(current);
i++;
}
else
{
break
;
}
}
if
(i == position -
1
) {
nextId = XOR(prevId, current.link,
0
);
current.link = XOR(nextId, current.link, System.identityHashCode(newNode));
if
(nextId !=
0
) {
Node nxt = typeCast(nextId);
nxt.link = XOR(System.identityHashCode(newNode), nxt.link, System.identityHashCode(current));
newNode.link = XOR(System.identityHashCode(current), System.identityHashCode(nxt),
0
);
}
else
{
newNode.link = System.identityHashCode(current);
}
nodes.put(System.identityHashCode(newNode), newNode);
}
else
{
System.out.println(
"Out of range"
);
}
}
}
}
private
Node typeCast(
int
ptr) {
return
nodes.get(ptr);
}
}
public
class
Main {
public
static
void
main(String[] args) {
XorLinkedList obj =
new
XorLinkedList();
obj.insertAtPosition(
10
,
1
);
obj.insertAtPosition(
20
,
1
);
obj.insertAtPosition(
30
,
3
);
obj.insertAtPosition(
40
,
2
);
obj.forwardTraversal();
}
}