public class circularLL {
private class Node{
int data;
Node next;
}
private Node head=null;
private Node tail=null;
private int size;
public void display() {
Node current = this.head;
while(current!=head) {
System.out.print(current.data+" ");
current=current.next;
}
}
public void addLast(int item) {
//create a new node
Node nn =new Node();
nn.data=item;
nn.next=null;
if(this.size==0) {
this.head=nn;
this .tail=nn;
nn.next=head;
this.size++;
}else {
this.tail.next=nn;
this.tail=nn;
this.tail.next=head;
this.size++;
}
}
public void addFirst(int item) {
//create a new node
Node nn= new Node();
nn.data=item;
nn.next=null;
//attach
if(this.size>=1) {
nn.next=head;
}
//summary object
if(this.size==0) {
this.head=nn;
this.tail=nn;
nn.next=head;
this.size++;
}else {
this.head=nn;
this.size++;
}
}
public int getFirst() throws Exception {
if(this.size==0) {
throw new Exception("LL is empty");
}
return this.head.data;
}
public int getLast() throws Exception {
if(this.size==0) {
throw new Exception("LL is Empty");
}
return this.tail.data;
}
public int getAt(int idx) throws Exception {
if(this.size==0) {
throw new Exception("LL is empty");
}
if(idx<0||idx>=this.size) {
throw new Exception("invalid index");
}
Node temp= this.head;
for(int i=1;i<=idx;i++) {
temp=temp.next;
}
return temp.data;
}
private Node getNodeAt(int idx) throws Exception{
if(this.size==0) {
throw new Exception("LL is empty");
}
if(idx<0||idx>=this.size) {
throw new Exception("invalid index");
}
Node temp= this.head;
for(int i=1;i<=idx;i++) {
temp=temp.next;
}
return temp;
}
public void addAt(int item,int idx) throws Exception{
if(idx<0||idx>this.size) {
throw new Exception("invalid index");
}
if(idx==0) {
addFirst(item);
}
else if(idx==this.size) {
addLast(item);
}else {
//create a new node
Node nn = new Node();
nn.data=item;
nn.next=null;
//attach
Node nm1=getNodeAt(idx-1);
Node np1=getNodeAt(idx);
nm1.next=nn;
nn.next=np1;
this.size++;
}
}
public int removeFirst() throws Exception{
if(this.size==0) {
throw new Exception("LL is empty");
}
int rv= this.head.data;
//summary
if(this.size==1) {
this.head=null;
this.tail=null;
this.size=0;
}else {
this.head=this.head.next;
}
return rv;
}
public int removeLast() throws Exception {
if(this.size==0) {
throw new Exception("LL is empty");
}
int rv=this.tail.data;
if(this.size==1) {
this.head=null;
this.tail=null;
this.size=0;
}else {
Node sizem2 = getNodeAt(this.size-2);
this.tail=sizem2;
this.tail.next=null;
this.size--;
}
return rv;
}
public int removeAt(int idx) throws Exception{
if(this.size==0) {
throw new Exception("LL is Empty");
}
if(idx<0||idx>=this.size) {
throw new Exception("Invalid index");
}
if(idx==0) {
return removeFirst();
}else if(idx==this.size-1) {
return removeLast();
}else {
Node nm1 = getNodeAt(idx-1);
Node n = nm1.next;
Node np1=n.next;
nm1.next=np1;
this.size--;
return n.data;
}
}
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
circularLL list = new circularLL();
list.addFirst(2);
list.addFirst(3);
list.addLast(4);
list.addLast(5);
list.addLast(6);
list.addLast(7);
list.addFirst(2);
//list.removeLast();
//list.removeAt(2);
//System.out.println(list.getAt(2));
list.display();
}
}