
package Interface_form;
public interface Queue<E> {
/**
*
* @param data queue에 추가할 요소
* @return 정상적으로 추가되었을 때 true 반환
*/
boolean offer(E data);
/**
* queue의 첫번 째 요소를 삭제하고 해당 요소를 반환
* @return queue의 첫번 째 요소
*/
E poll();
/**
* queue의 첫번 째 요소를 삭제하지 않고 반환
* @return Queue의 첫번 쨰 요소
*/
E peek();
}
public class Node<E> {
E data;
Node<E> next;
Node<E> prev;
Node(E data){
this.data = data;
this.next = null;
this.prev = null;
}
}
import java.util.NoSuchElementException;
import Interface_form.Queue;
public class LinkedListDeque<E> implements Queue<E> {
private Node<E> head;
private Node<E> tail;
private int size;
public LinkedListDeque() {
this.head = null;
this.tail = null;
this.size = 0;
}
// offer method
public boolean offerFirst(E data) {
Node<E> newNode = new Node<E>(data);
newNode.next = head;
if(head != null) {
head.prev = newNode;
}
head = newNode;
size++;
if(head.next == null) {
tail = head;
}
return true;
}
public boolean offer(E data) {
return offerLast(data);
}
public boolean offerLast(E data) {
if(size == 0) {
return offerFirst(data);
}
Node<E> newNode = new Node<E>(data);
tail.next = newNode;
newNode.prev = tail;
tail = newNode;
size++;
return true;
}
// poll / remove method
public E poll() {
return pollFirst();
}
public E pollFirst() {
if(size == 0) {
return null;
}
E element = head.data;
Node<E> nextNode = head.next;
head.data = null;
head.next = null;
if(nextNode != null) {
nextNode.prev = null;
}
head = null;
head = nextNode;
size--;
if(size == 0) {
tail = head; //head == null
}
return element;
}
public E remove() {
return removeFirst();
}
public E removeFirst() {
E element = pollFirst();
if(element == null) {
throw new NoSuchElementException();
}
return element;
}
public E pollLast() {
if(size == 0) {
return null;
}
E element = tail.data;
Node<E> prevNode = tail.prev;
tail.data = null;
tail.prev = null;
if(prevNode!= null) {
prevNode.next = null;
}
tail = null;
tail = prevNode;
size--;
if(size == 0) {
head = null;
}
return element;
}
public E removeLast() {
E element = pollLast();
if(element == null) {
throw new NoSuchElementException();
}
return element;
}
// peek / element method
public E peek() {
return peekFirst();
}
public E peekFirst() {
if(size == 0) {
return null;
}
return head.data;
}
public E peekLast() {
if(size == 0) {
return null;
}
return tail.data;
}
public E element() {
return getFirst();
}
public E getFirst() {
E element = peek();
if(element == null) {
throw new NoSuchElementException();
}
return element;
}
public E getLast() {
E element = peekLast();
if(element == null) {
throw new NoSuchElementException();
}
return element;
}
//other methods
public int size() {
return size;
}
public boolean isEmpty() {
return size == 0;
}
public boolean contains(E data) {
Node<E> n = head;
for(; n != null; n = n.next) {
if(data.equals(n.data)) {
return true;
}
}
return false;
}
public void clear() {
for(Node<E> n = head; n!= null;) {
Node<E> nextNode = n.next;
n.data = null;
n.prev = null;
n.next = null;
n = nextNode;
}
size = 0;
head = tail = null;
}
}
https://st-lab.tistory.com/161?category=856997
내가 직접 코딩해보고 사이트를 확인하여 수정하는 방법으로 구현을 진행했음