public void AddAfter(DoubleLinkedListNode <T> current, DoubleLinkedListNode <T> newNode) { if (head == null || current == null || newNode == null) { throw new InvalidOperationException(); } // Current : 1 // NewNode ; 2 // 기존 Next ; 3 - 라고 생각했을 떄 newNode.Next = current.Next; // 2과 3를 연결 current.Next.Prev = newNode; // 3의 이전 숫자는 2 newNode.Prev = current; // 2의 이전 숫자는 1 current.Next = newNode; // 1과 2를 연결 }
public void Add(DoubleLinkedListNode <T> newNode) { // 첫번째 노드면 if (head == null) { head = newNode; head.Next = null; head.Prev = null; } else { var tail = head.Prev; // 오해하지 말자 - Tail은 마지막 노드를 의미한다. // 처음과 마지막 사이에 데이터를 차곡차곡 쌓아가는 느낌으로다가.. head.Prev = newNode; tail.Next = newNode; newNode.Prev = tail; newNode.Next = head; } }
public void Remove(DoubleLinkedListNode <T> removeNode) { if (head == null || removeNode == null) { return; } // 삭제할 노드가 헤드 + 노드가 1개일 경우 if (removeNode == head && head == head.Next) { head = null; } // prev 노드와 Next 노드를 연결 및 removeNode를 Null처리한다. else { removeNode.Prev.Next = removeNode.Next; removeNode.Next.Prev = removeNode.Prev; } removeNode = null; }
// 원형 연결 리스트인지 체크하는 방법 - 한 바퀴 돌려서 Head가 나오면 원형, 아니면 원형이 아님 public bool IsCircular(DoubleLinkedListNode <T> node) { if (head == null) { return(true); } var current = head; // 연결이 안되어있으면 결국 Null이 나올 거니까 while (current != null) { current = current.Next; if (current == head) { return(true); } } return(false); }
public void Add(DoubleLinkedListNode <T> newNode) { // 첫 데이터를 경우 if (head == null) { head = newNode; } else { var current = head; // DoubleLinkedList의 마지막(Tail) 까지 이동 while (current != null && current.Next != null) { current = current.Next; } current.Next = newNode; newNode.Next = null; // 마지막이니까 newNode.Prev = current; } }
public DoubleLinkedListNode(T Data, DoubleLinkedListNode <T> prev, DoubleLinkedListNode <T> next) { this.Data = Data; this.Prev = prev; this.Next = next; }