using
System;
using
System.Collections.Generic;
class
GFG{
class
Node {
public
int
data;
public
Node next;
};
static
Node push(Node head_ref,
int
data)
{
Node ptr1 =
new
Node();
Node temp = head_ref;
ptr1.data = data;
ptr1.next = head_ref;
if
(head_ref !=
null
) {
while
(temp.next != head_ref)
temp = temp.next;
temp.next = ptr1;
}
else
ptr1.next = ptr1;
head_ref = ptr1;
return
head_ref;
}
static
void
deleteNode(Node head_ref, Node del)
{
Node temp = head_ref;
if
(head_ref == del)
head_ref = del.next;
while
(temp.next != del) {
temp = temp.next;
}
temp.next = del.next;
del =
null
;
return
;
}
static
int
largestElement(Node head_ref)
{
Node current;
current = head_ref;
int
maxEle =
int
.MinValue;
do
{
if
(current.data > maxEle) {
maxEle = current.data;
}
current = current.next;
}
while
(current != head_ref);
return
maxEle;
}
static
void
createHash(HashSet<
int
> hash,
int
maxElement)
{
int
prev = 0, curr = 1;
hash.Add(prev);
hash.Add(curr);
while
(curr <= maxElement) {
int
temp = curr + prev;
hash.Add(temp);
prev = curr;
curr = temp;
}
}
static
void
deleteFibonacciNodes(Node head)
{
int
maxEle = largestElement(head);
HashSet<
int
> hash =
new
HashSet<
int
>();
createHash(hash, maxEle);
Node ptr = head;
Node next;
do
{
if
(hash.Contains(ptr.data))
deleteNode(head, ptr);
next = ptr.next;
ptr = next;
}
while
(ptr != head);
}
static
void
printList(Node head)
{
Node temp = head;
if
(head !=
null
) {
do
{
Console.Write(
"{0} "
, temp.data);
temp = temp.next;
}
while
(temp != head);
}
}
public
static
void
Main(String[] args)
{
Node head =
null
;
head = push(head, 20);
head = push(head, 13);
head = push(head, 6);
head = push(head, 34);
head = push(head, 11);
head = push(head, 9);
deleteFibonacciNodes(head);
printList(head);
}
}