원형 이중 연결 리스트(CircularDoublyLinkedList)
by Seungbeom Kim
원형 이중 연결 리스트
원형 단일 연결 리스트는 맨 앞에 값을 넣을 때, 항상 마지막 노드를 찾아야 한다. 하지만 원형 이중 연결 리스트는 입력, 삭제, 찾기 등이 수월하다.
public class CircularDoublyLinkedList {
static class Node {
int data;
Node next, prev;
Node(int d) {
this.data = d;
this.next = null;
this.prev = null;
}
}
private static Node head = null;
public static void deleteNode(int index) {
Node target = null;
for(int i=0; i<index; i++) {
if(target == null) {
target = head;
}
else {
target = target.next;
}
}
if(target == null) {
Node temp = head.next;
temp.prev = head.prev;
head.prev.next = temp;
head = temp;
}
else {
if(target.next == head) {
head.prev = target.prev;
target.prev.next = head;
}
else {
Node temp = target.next.next;
temp.prev = target;
target.next = temp;
}
}
}
public static void addNode(int data, int index) {
Node target = null;
for(int i=0; i<index; i++) {
if(target == null) {
target = head;
}
else {
target = target.next;
}
}
Node temp = null;
Node newNode = new Node(data);
if(target == null) {
temp = head;
newNode.next = temp;
newNode.prev = temp.prev;
temp.prev.next = newNode;
temp.prev = newNode;
head = newNode;
}
else {
if(target.next == head) {
newNode.next = target.next;
newNode.prev = target;
target.next = newNode;
head.prev = newNode;
}
else {
temp = target.next;
temp.prev = newNode;
newNode.next = temp;
newNode.prev = target;
target.next = newNode;
}
}
}
public static void addNode(int data) {
if(head == null) {
head = new Node(data);
head.prev = head;
head.next = head;
}
else {
Node target = head;
while(target.next != head) {
target = target.next;
}
target.next = new Node(data);
target.next.next = head;
target.next.prev = target;
head.prev = target.next;
}
}
public static void main(String[] args) throws IOException {
addNode(1);
addNode(2);
addNode(3);
addNode(4);
addNode(5);
addNode(6);
addNode(7);
addNode(9, 2);
addNode(9, 1);
addNode(10, 0);
deleteNode(0);
deleteNode(1);
deleteNode(2);
Node prev = head;
Node temp = head;
while(temp.next != head) {
System.out.format("%d ", temp.data);
temp = temp.next;
if(temp.next == head) {
System.out.format("%d ", temp.data);
}
}
System.out.println("\n");
while(prev.prev != head) {
System.out.format("%d ", prev.data);
prev = prev.prev;
if(prev.prev == head) {
System.out.format("%d ", prev.data);
}
}
}
}
Subscribe via RSS