一.使用链表实现栈
增,删,查只对链表头进行操作,时间复杂度都为O(1)
链表头作为栈顶
LinkedListStack<E> implements Stack<E>
public class LinkedListStack<E> implements Stack<E> { private LinkedList<E> list; public LinkedListStack(){ list = new LinkedList<>(); } @Override public int getSize() { return list.getSize(); } @Override public boolean isEmpty() { return list.isEmpty(); } @Override public void push(E e) { list.addFirst(e); } @Override public E pop() { return list.removeFirst(); } @Override public E peek() { return list.getFirst(); } @Override public String toString() { StringBuilder res = new StringBuilder(); res.append("Stack: top"); res.append(list); return res.toString(); } }
二.使用链表实现队列
从两端添加元素很容易
从tail端删除元素不容易
所以,从head端删除元素,从tail端插入元素
不使用虚拟头节点,因为不从中间插入元素
由于没有设置dummyHead,要注意链表为空的情况
以下来设计方法:
新建一个类LinkedListQueue<E> implements Queue<e>
1.内部类Node
public class LinkedListQueue<E> implements Queue<E>{ private class Node{ public E e; public Node next; public Node(E e, Node next){ this.e = e; this.next = next; } public Node(E e){ this(e, null); } public Node(){ this(null,null); } @Override public String toString() { return super.toString(); } }
2.基本成员变量
private Node head, tail; private int size;
3.基本方法
public LinkedListQueue(){ head = null; tail = null; size = 0; } @Override public int getSize() { return size; } @Override public boolean isEmpty() { return size == 0; }
4.入队操作
a.先判断tail是否为空,直接有tail = new Node(e),令head = tail。
b.否则有tail.next = new Node(e),tail = tail.next。
c.最后维护size,size ++。
@Override public void enqueue(E e) { if(tail == null){ tail = new Node(e); head = tail; }else{ tail.next = new Node(e); tail = tail.next; } size ++; }
5.出队操作
a.先判断队列是否为空,若为空则抛出异常
b.先令头节点Node retNode = head;
让头节点指向原头节点的next,head = head.next
令retNode与链表断开,即retNode.next = null
c.如果原来队列里只有一个元素,此时head == null,则需要维护tail,使tail = null
d.最后维护size,size --,并返回retNode.e
@Override public E dequeue() { if(isEmpty()) throw new IllegalArgumentException("Cannot dequeue from an empty queue"); Node retNode = head; head = head.next; retNode.next = null; //原来只有一个元素 if(head == null){ tail = null; } size --; return retNode.e; }
6.查看队首元素
@Override public E getFront() { if(isEmpty()) throw new IllegalArgumentException("Cannot dequeue from an empty queue"); return head.e; }
7.重写toString()方法
@Override public String toString() { StringBuilder res = new StringBuilder(); // Node cur = dummyhead.next; // while(cur != null){ // res.append(cur+"->"); // cur = cur.next; // } res.append("Queue: front:"); for(Node cur = head ; cur != null ; cur = cur.next){ res.append(cur + "—>"); } res.append("NULL tail"); return res.toString(); }