public
class
GFG {
private
class
Node {
private
int
data;
private
Node next;
private
Node previous;
public
Node(
int
data, Node next,
Node previous)
{
this
.data = data;
this
.next = next;
this
.previous = previous;
}
public
int
getData()
{
return
data;
}
public
void
setData(
int
data)
{
this
.data = data;
}
public
Node getNext()
{
return
next;
}
public
void
setNext(Node next)
{
this
.next = next;
}
public
Node getPrevious()
{
return
previous;
}
public
void
setPrevious(Node previous)
{
this
.previous = previous;
}
}
private
Node head;
private
Node tail;
public
GFG()
{
this
.head =
null
;
this
.tail =
null
;
}
public
Node getHead()
{
return
head;
}
public
void
setHead(Node head)
{
this
.head = head;
}
public
Node getTail()
{
return
tail;
}
public
void
setTail(Node tail)
{
this
.tail = tail;
}
public
void
swapNode(Node headReference,
Node tailReference,
int
k)
{
if
(k ==
1
) {
swapFirstAndLast(headReference,
tailReference);
return
;
}
int
nodeCount = getCount(headReference);
if
(k == nodeCount) {
swapFirstAndLast(headReference,
tailReference);
return
;
}
if
(
2
* k -
1
== nodeCount) {
return
;
}
Node fNode = headReference;
for
(
int
i =
1
; i < k; i++) {
fNode = fNode.getNext();
}
Node fNodePrevious = fNode.getPrevious();
Node fNodeNext = fNode.getNext();
Node sNode = tailReference;
for
(
int
i =
1
; i < k; i++) {
sNode = sNode.getPrevious();
}
Node sNodePrevious = sNode.getPrevious();
Node sNodeNext = sNode.getNext();
if
(fNodePrevious !=
null
&& sNode !=
null
) {
fNodePrevious.setNext(sNode);
sNode.setPrevious(fNodePrevious);
sNode.setNext(fNodeNext);
fNodeNext.setPrevious(sNode);
}
if
(sNodePrevious !=
null
&& sNodeNext !=
null
) {
sNodeNext.setPrevious(fNode);
fNode.setNext(sNodeNext);
sNodePrevious.setNext(fNode);
fNode.setPrevious(sNodePrevious);
}
}
private
void
swapFirstAndLast(
Node headReference,
Node tailReference)
{
Node headRef = headReference;
Node tailRef = tailReference;
headReference
= headReference.getNext();
tailReference
= tailReference.getPrevious();
tailReference.setNext(headRef);
headRef.setPrevious(tailReference);
headRef.setNext(
null
);
this
.setTail(tailReference.getNext());
headReference.setPrevious(tailRef);
tailRef.setNext(headReference);
tailRef.setPrevious(
null
);
this
.setHead(headReference
.getPrevious());
}
private
int
getCount(Node headReference)
{
int
nodeCount =
0
;
while
(headReference !=
null
) {
nodeCount++;
headReference = headReference
.getNext();
}
return
nodeCount;
}
public
void
printList(Node headReference)
{
if
(headReference ==
null
) {
System.out.println(
"Doubly linked list is empty"
);
return
;
}
else
{
while
(headReference !=
null
) {
System.out.print(
headReference.getData()
+
" "
);
headReference
= headReference.getNext();
}
}
}
public
void
push(
int
data)
{
Node newNode
=
new
Node(data,
null
,
null
);
if
(head ==
null
) {
head = tail = newNode;
}
else
{
tail.setNext(newNode);
newNode.setPrevious(tail);
tail = newNode;
}
}
public
static
void
main(String[] args)
{
GFG list =
new
GFG();
list.push(
1
);
list.push(
2
);
list.push(
3
);
list.push(
4
);
list.push(
5
);
int
K =
2
;
list.swapNode(list.getHead(),
list.getTail(), K);
list.printList(list.getHead());
}
}