package Cap1;
import java.util.Iterator;
import edu.princeton.cs.introcs.StdOut;
import edu.princeton.cs.introcs.StdRandom;
public class DoubleNode<Item> implements Iterable<Item> {
/**
* @param args
*/
private Node first=null, last = null;
private class Node {
Item item;
Node prev,next;
}
public void push_front(Item item){
Node node = new Node();
node.item = item;
if(first == null){
first = node;
last = node;
}
else{
first.prev = node;
node.next = first;
first = node;
}
}
public void push_back(Item item){
Node node = new Node();
node.item = item;
if(last == null){
first = node;
last = node;
}
else{
last.next = node;
node.prev = last;
last = node;
}
}
public Item pop_back(){
if(last == null) return null;
else{
Item item = last.item;
last = last.prev;
last.next.prev = null;
last.next = null;
return item;
}
}
public Item pop_front(){
if(first == null) return null;
else{
Item item = first.item;
first = first.next;
first.prev.next = null;
first.prev = null;
return item;
}
}
private void remove(Node cur){
if(cur==null) return;
if(cur==first){
first = first.next;
first.prev = null;
}
else if(cur == last){
last = last.prev;
last.next = null;
}
else{
cur.prev.next = cur.next;
cur.next.prev = cur.prev;
}
cur.prev = null;
cur.next = null;
}
public void remove(int k){
Node cur = first;
for(int i=1;i<k && cur!=null;i++){
cur = cur.next;
}
remove(cur);
}
public void remove(Item item){
Node cur;
for(cur = first;cur!=null && cur.item!=item ;cur = cur.next);
if(cur == null) return;
remove(cur);
}
public void removeBefore(Item item){
Node cur;
for(cur = first;cur!=null && cur.item!=item;cur = cur.next);
if(cur == null) return; // not find the node
remove(cur.prev); // delete the node before cur;
}
public void removeAfter(Item item){
Node cur;
for(cur = first;cur!=null && cur.item!=item;cur = cur.next);
if(cur == null) return;
remove(cur.next); // delete the node before cur;
}
@Override
public Iterator<Item> iterator() {
// TODO Auto-generated method stub
return new DoubleNodeIterator();
}
private class DoubleNodeIterator implements Iterator<Item>{
private Node cur = first;
@Override
public boolean hasNext() {
// TODO Auto-generated method stub
return cur != null;
}
@Override
public Item next() {
// TODO Auto-generated method stub
Item item = cur.item;
cur = cur.next;
if(cur!=null){
cur.prev.next = null;
cur.prev = null;
}
return item;
}
@Override
public void remove() {
// TODO Auto-generated method stub
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
DoubleNode<Integer> dn = new DoubleNode<Integer>();
for(int i=0;i<10;i++){
dn.push_back(i*10);
}
dn.removeAfter(Integer.valueOf(80));
dn.pop_front();
dn.pop_back();
for(Integer d : dn){
StdOut.println(d);
}
}
}