next는 null을 가리킨다.Array vs Linked List
장점
Array는 삽입, 삭제시에 O(n)의 worst case가 존재하지만, LL은 둘 다 constant time만에 수행 가능하다. 즉, Array보다 더 flexible하다고 표현한다.
단점
Array는 index로 O(1)만에 접근이 가능하지만, LL는 어떤 노드를 찾기 위해서는 첫 노드에서 해당 값까지 순회해야 한다. 따라서 random access를 allow 하지 않는다.
Array와 같은 '연속적인 자료구조'에서는 우측(끝)에서 삽입, 삭제가 이뤄지는 것이 최선이지만, Singly Linked List에서는 비효율적이다!
size(), isEmpty()first(), last(), prev(p), next(p)set(p, e), addBefore(p, e), addAfter(p, e), addFirst(e), addLast(e), remove(p)p.size() ...p.getHead(), p.getTail, p.prev(), p.next()p.set(p, e), p.addBefore(p, e), ...header at head, trailer at tail 노드들을 양 끝 단에 위치시키고, 항상 그 사이에서만 노드의 편집이 일어나도록 놔둔 것.public DoublyLinkedList() {
header = new Node<>(null, null, null);
trailer = new Node<>(null, header, null);
header.next = trailer;
size = 0;
}
위처럼 선언하고, 나머지 노드 편집은 사이에서 일어나게 조절하면 끝.
Tail node는 SLL과 DLL 둘 다 가질 수 있는 것인가?
- 그렇다. DLL과 SLL의 개념적 차이는
prev가 있냐 없냐에 달렸기 때문에,tail노드의 구현 여부는 상관 없다.- 그래서 SLL로도 큐를 구현할 수 있다는 것.
SLL에서도 'rear에서의 삭제'가 tail의 앞 노드를 찾아야 하기 때문에 비효율적이라고 했지, 삽입은 구현 가능하다.
그러므로 head 삭제, tail 삽입은 매우 가능.public void enqueue(Object e) { Node v = new Node(e, null); // 새 노드 (next = null) if (isEmpty()) { head = v; tail = v; } else { tail.setNext(v); tail = v; } size++; } public Object dequeue() { if (isEmpty()) throw new NoSuchElementException(); Object elem = head.getElement(); head = head.getNext(); size--; if (isEmpty()) tail = null; // 마지막 노드 뺐을 때 tail도 null 처리 return elem; }