package com.interview.linklist; /** * http://www.geeksforgeeks.org/design-a-stack-with-find-middle-operation/ * Test cases: * Delete middle with 1,2,3 element * Pop with 1,2,3 elements * Delete or pop when empty stack */ public class StackWithLinkListMiddleOperation { private Node head = null; private Node middle = null; private int size = 0; public void push(int data){ if(head == null){ head = Node.newNode(data); middle = head; size++; return; } size++; Node node = Node.newNode(data); node.next = head; head.before = node; head = node; if(size % 2 ==0){ middle = middle.before; } } public boolean hasMore(){ if(size > 0 ){ return true; }else{ return false; } } public int size(){ return size; } public int pop(){ if(size == 0){ throw new IllegalArgumentException(); } size--; if(size % 2 != 0 || size == 0){ middle = middle.next; } int data = head.data; head = head.next; head.before = null; return data; } public int top(){ if(size == 0){ throw new IllegalArgumentException(); } return head.data; } public int middle(){ if(size == 0){ throw new IllegalArgumentException(); } return middle.data; } public int deleteMiddle(){ if(size == 0){ throw new IllegalArgumentException(); } size--; if(middle == head){ int data = middle.data; middle = middle.next; head = head.next; if(head != null){ head.before = null; } return data; } if(size % 2 == 0){ int data = middle.data; Node next = middle.next; middle = middle.before; middle.next = next; if(next != null){ next.before = middle; } return data; } else{ int data = middle.data; Node before = middle.before; middle = middle.next; middle.before = before; if(before != null){ before.next = middle; } return data; } } public static void main(String args[]){ StackWithLinkListMiddleOperation swl = new StackWithLinkListMiddleOperation(); swl.push(1); System.out.println(swl.top() + " " + swl.middle()); swl.push(2); System.out.println(swl.top() + " " + swl.middle()); swl.push(3); System.out.println(swl.top() + " " + swl.middle()); swl.push(4); System.out.println(swl.top() + " " + swl.middle()); swl.push(5); System.out.println(swl.top() + " " + swl.middle()); swl.push(6); System.out.println(swl.top() + " " + swl.middle()); System.out.println("\n\n"); swl.pop(); System.out.println(swl.top() + " " + swl.middle()); swl.deleteMiddle(); System.out.println(swl.top() + " " + swl.middle()); swl.pop(); System.out.println(swl.top() + " " + swl.middle()); swl.deleteMiddle(); System.out.println(swl.top() + " " + swl.middle()); swl.pop(); System.out.println(swl.top() + " " + swl.middle()); swl.deleteMiddle(); } }