Skip to content

Latest commit

 

History

History
187 lines (159 loc) · 3.07 KB

File metadata and controls

187 lines (159 loc) · 3.07 KB

LinkedList 구현

코드

// Doubly Linked List : 삽입, 삭제, 탐색
public class Test {
	public static void main(String[] args) {
		DoublyLinkedList list = new DoublyLinkedList();
		list.addFirst(2);
		list.addFirst(1);
		list.addFirst(0);
		list.addLast(3);
		list.addLast(4);
		list.addLast(5);
		list.add(1, 5);
		list.removeFirst();
		list.removeFirst();
		list.removeFirst();
		list.add(0, 1);
		list.removeLast();
		list.removeLast();
		list.removeLast();
		list.addLast(3);
		list.addLast(4);
		list.addLast(5);
		list.remove(1);
		list.remove(1);
		list.remove(1);
		System.out.println(list.print());
	}

}

class DoublyLinkedList {
	private Node head, tail;
	private int size;

	class Node {
		int data;
		Node prev, next;

		public Node(int data) {
			this.data = data;
		}
	}

	// 삽입
	// 첫번째 노드에 삽입
	public void addFirst(int data) {
		if (size == 0) {
			head = new Node(data);
			tail = head;
		} else {
			Node newNode = new Node(data);
			head.prev = newNode;
			newNode.next = head;
			head = newNode;
		}
		size++;
	}

	// 마지막 노드에 삽입
	public void addLast(int data) {
		if (size == 0) {
			addFirst(data);
		} else {
			Node newNode = new Node(data);
			tail.next = newNode;
			newNode.prev = tail;
			tail = newNode;
		}
		size++;
	}

	// 임의의 위치에 삽입
	public void add(int index, int data) {
		if (index >= size) {
			index = size - 1;
		}

		if (index == 0 || size == 0) {
			addFirst(data);
		} else if (index == size - 1) {
			addLast(data);
		} else {
			Node prevNode = get(index - 1);
			Node nextNode = prevNode.next;

			Node newNode = new Node(data);
			prevNode.next = newNode;
			newNode.prev = prevNode;

			nextNode.prev = newNode;
			newNode.next = nextNode;
			size++;
		}
	}

	// 삭제
	// 맨앞 삭제
	public Node removeFirst() {
		if (size == 0) return null;
		
		Node node = head;
		head = node.next;
		head.prev = null;
		size--;
		return node;
	}

	// 맨뒤 삭제
	public Node removeLast() {
		if (size == 0) return null;
		
		Node node = tail;
		tail = node.prev;
		tail.next = null;
		size--;
		return node;
	}

	// 임의의 위치 노드 삭제
	public Node remove(int index) {
		if (index >= size) {
			index = size - 1;
		}

		if (index <= 0) {
			return removeFirst();
		} else if (index == size - 1) {
			return removeLast();
		} else {
			Node node = get(index);
			Node prevNode = node.prev;
			Node nextNode = node.next;

			prevNode.next = nextNode;
			nextNode.prev = prevNode;
			size--;
			return node;
		}
	}
	
	public boolean isEmpty() {
		if (size == 0) return true;
		return false;
	}
	
	// size
	public int size() {
		return size;
	}

	// 출력
	public String print() {
		StringBuilder sb = new StringBuilder();
		Node node = head;
		while (true) {
			if (node == tail) {
				sb.append(node.data);
				break;
			} else {
				sb.append(node.data).append(", ");
				node = node.next;
			}
		}

		return sb.toString();
	}

	// 특정 위치 노드 리턴
	private Node get(int index) {
		int idx = 0;
		Node node = head;
		while (idx < index) {
			node = node.next;
			idx++;
		}

		return node;
	}
}