class
Node {
int
val;
Node next;
public
Node(
int
x) {
val = x;
next =
null
;
}
}
public
class
MoveFibonacciToEnd {
static
boolean
isFibonacci(
int
num) {
if
(num ==
0
|| num ==
1
) {
return
true
;
}
int
a =
0
, b =
1
;
while
(b < num) {
int
temp = b;
b = a + b;
a = temp;
}
return
b == num;
}
static
Node moveFirstFibonacciToEnd(Node head) {
if
(head ==
null
|| head.next ==
null
) {
return
head;
}
Node prev =
null
;
Node current = head;
Node firstFibonacciPrev =
null
;
Node firstFibonacci =
null
;
while
(current !=
null
) {
if
(isFibonacci(current.val)) {
firstFibonacciPrev = prev;
firstFibonacci = current;
break
;
}
prev = current;
current = current.next;
}
if
(firstFibonacci ==
null
) {
return
head;
}
if
(firstFibonacciPrev !=
null
) {
firstFibonacciPrev.next = firstFibonacci.next;
}
else
{
head = firstFibonacci.next;
}
prev = current;
while
(prev.next !=
null
) {
prev = prev.next;
}
prev.next = firstFibonacci;
firstFibonacci.next =
null
;
return
head;
}
static
void
printLinkedList(Node head) {
while
(head !=
null
) {
System.out.print(head.val +
" -> "
);
head = head.next;
}
System.out.println(
"NULL"
);
}
public
static
void
main(String[] args) {
Node head1 =
new
Node(
10
);
head1.next =
new
Node(
15
);
head1.next.next =
new
Node(
8
);
head1.next.next.next =
new
Node(
13
);
head1.next.next.next.next =
new
Node(
21
);
head1.next.next.next.next.next =
new
Node(
5
);
head1.next.next.next.next.next.next =
new
Node(
2
);
System.out.print(
"Input: "
);
printLinkedList(head1);
Node newHead1 = moveFirstFibonacciToEnd(head1);
System.out.print(
"Output: "
);
printLinkedList(newHead1);
Node head2 =
new
Node(
3
);
head2.next =
new
Node(
1
);
head2.next.next =
new
Node(
4
);
head2.next.next.next =
new
Node(
11
);
head2.next.next.next.next =
new
Node(
6
);
head2.next.next.next.next.next =
new
Node(
18
);
head2.next.next.next.next.next.next =
new
Node(
24
);
System.out.print(
"Input: "
);
printLinkedList(head2);
Node newHead2 = moveFirstFibonacciToEnd(head2);
System.out.print(
"Output: "
);
printLinkedList(newHead2);
}
}