DoubleLinkedDeque 구현 with Java

정찬·2023년 5월 15일

자료구조

목록 보기
7/7

저번 시간에는 Deque을 Array로 구현해봤다.

이번에는 노드로 구현해보겠다.

doubleLinkedList의 구현과 ArrayDeque의 개념을 섞어놓은 느낌이라 전체 코드로 짧게 포스팅하겠다.

package Queue;

import List.MyDoubleLinkedList;

import java.util.NoSuchElementException;

public class MyDoubleLinkedDeque<E> implements CusTomDoubleLinkedDeque<E>{

    Node<E> head;
    Node<E> tail;
    int size;

    public MyDoubleLinkedDeque(){
        head = null;
        tail = null;
        size = 0;
    }
    @Override
    public boolean offerFirst(E value) {
        Node<E> node = new Node<>(value);
        if(isEmpty()) {
            head = tail = node;
        }
        else {
            node.next = head;
            head.prev = node;
            head = node;
        }
        size++;
        return true;
    }

    @Override
    public boolean offerLast(E value) {
        if(isEmpty())
            return offerFirst(value);

        Node<E> node = new Node<>(value);

        tail.next = node;
        node.prev = tail;
        tail = node;
        size++;

        return true;
    }

    @Override
    public E pollFirst() {
        if(isEmpty())
            return null;

        E returnData = head.data;
        size--;

        if(isEmpty())
            head = tail = null;

        else{
            head.next.prev = null;
            head = head.next;
        }

        return returnData;
    }

    @Override
    public E remove() {
        if(isEmpty())
            throw new NoSuchElementException("비어있음");

        return pollFirst();
    }

    @Override
    public E removeFirst() {
        return remove();
    }

    @Override
    public E pollLast() {
        if(isEmpty())
            return null;

        E returnData = tail.data;

        size--;
        if(isEmpty())
            head = tail = null;

        else{
            tail.prev.next = null;
            tail = tail.prev;
        }

        return returnData;
    }

    @Override
    public E removeLast() {
        if(isEmpty())
            throw new NoSuchElementException("비어있음");

        return pollFirst();
    }

    @Override
    public E peekFirst() {
        if(isEmpty())
            return null;

        return head.data;
    }

    @Override
    public E peekLast() {
        if(isEmpty())
            return null;

        return tail.data;
    }

    @Override
    public E element() {
        if(isEmpty())
            throw new NoSuchElementException("비어있음");

        return head.data;
    }

    @Override
    public E getFirst() {
        if(isEmpty())
            throw new NoSuchElementException("비어있음");

        return head.data;
    }

    @Override
    public E getLast() {
        if(isEmpty())
            throw new NoSuchElementException("비어있음");

        return tail.data;
    }

    @Override
    public boolean isEmpty() {
        return size == 0;
    }

    @Override
    public boolean contains(Object value) {
        Node<E> node = head;

        for(int i = 0; i < size; i++){
            if(node.data.equals(value))
                return true;

            node = node.next;
        }
        return false;
    }

    @Override
    public void clear() {
        Node<E> node = head;
        Node<E> nextNode = head;
        for(int i = 0; i < size; i++){
            node = nextNode;
            node.data = null;
            node.prev = null;
            nextNode = node.next;
            node.next = null;
        }
    }

    @Override
    public <T> T[] toArray(T[] a) {
        int iterLength = size;
        if(a.length < size)
            iterLength = a.length;

        Node<E> node = head;
        for(int i = 0; i < iterLength; i++){
            a[i] = (T)node.data;
            node = node.next;
        }
        return a;
    }

    @Override
    public boolean offer(E e) {
        return offerLast(e);
    }

    @Override
    public E poll() {
        return pollFirst();
    }

    @Override
    public E peek() {
        return peekFirst();
    }

    @Override
    public Object[] toArray() {
        return toArray(new Object[size]);
    }

    @Override
    public int size() {
        return size;
    }

    class Node<E>{
        E data;
        Node<E> next;
        Node<E> prev;

        Node(){

        }
        Node(E data) {
            this.data = data;
            this.prev = null;
            this.next = null;
        }
    }
}
profile
25.06.24 ~ inblog에서 velog로 이전

0개의 댓글