※ 원형 연결 리스트(Circular Linked List)란?
연결 리스트의 구조를 원형으로 만든것 -> 마지막 노드의 링크를 첫번째 노드에 걸어준다.
단순 연결 리스트는 이전 노드에 접근하려면 노드를 다시 처음부터 순회해야 되지만 원형 연결 리스트는 계속 순회하면 이전 노드에 접근할 수 있다.
1.원형 연결 리스트의 삽입연산
운형 연결 리스트에서의 삽입연산은 마지막 노드부분을 처음 노드와 연결하는 부분 빼고 단순 연결 리스트와 똑같다. 또한 원형 연결 리스트의 마지막 노드를 삽입하는 것이 곧 리스트의 첫 번째 노드를 삽입하는 것과 같은 의미이다.
그래서 원형 연결 리스트에서의 삽입연산은 첫 번째 노드 삽입과 중간 노드 삽입의 경우로 나눌 수 있다.
※ 구현
메인
public class Main {
      public static void main(String[] args) {
            CircularLinkedList list = new CircularLinkedList();
            //FirstNodeInsert Test
            list.FirstNodeInsert("목");
            list.FirstNodeInsert("화");
            list.FirstNodeInsert("월");
            list.printList();
            //MiddelNodeInsert Test
            Node pre = list.searchNode("수");
            list.middleNodeInsert("존재하지않는 노드", pre);
            pre = list.searchNode("화");
            list.middleNodeInsert("수", pre);
            pre = list.searchNode("목");
            list.middleNodeInsert("토", pre);
            list.middleNodeInsert("금", pre);
            list.printList();
            //Node Delete Test
            Node delNode = list.searchNode("일");
            list.deletNode(delNode);
            delNode = list.searchNode("월");
            list.deletNode(delNode);
            delNode = list.searchNode("수");
            list.deletNode(delNode);
            delNode = list.searchNode("토");
            list.deletNode(delNode);
            list.printList();
            //Node Reverse Test
            System.out.println("**Reverse List**");
            list.reverseList();
            list.printList();
      }
}
노드
public class Node {
      private String data;
      public Node link;
      public Node(){
            this.data = null;
            this.link = null;
      }
      public Node(String data) {
            // TODO Auto-generated constructor stub
            this.data = data;
      }
      public Node(String data, Node link){
            this.data = data;
            this.link = link;
      }
      public String getData( ){
            return this.data;
      }
}
연결리스트
public class CircularLinkedList {
      private Node head;
      public CircularLinkedList() {
            // TODO Auto-generated constructor stub
            this.head = null;
      }
      public void printList(){
            if(head ==null){
                  System.out.println("길이가 0인 리스트");
                  return;
            }
            Node temp = head;
            int idx = 1;
            //길이가 1인 리스트
            if(temp.link ==temp){
                  System.out.println("index : " + idx + " data : " + temp.getData());
            }else{
                  while(temp.link != head){
                        System.out.println("index : " + idx + " data : " + temp.getData());
                        temp = temp.link;
                        idx++;
                  }
                  System.out.println("index : " + idx + " data : " + temp.getData());
            }
      }
      public void FirstNodeInsert(String data){
            Node insertNode = new Node(data);
            if(this.head == null){
                  head=insertNode;
                  insertNode.link = insertNode;
            }else{
                  Node temp = head;
                  insertNode.link = head;
                  while(temp.link != head){
                        temp = temp.link;
                  }
                  temp.link = insertNode;
                  head = insertNode;
            }
      }
      public Node searchNode(String data){
            Node searchNode = new Node();
            searchNode = head;
            //middleNode Insert
            while(searchNode.link != head){
                  if(searchNode.getData().equals(data)){
                        return searchNode;
                  }else{
                        searchNode = searchNode.link;
                  }
            }
            //lastNode Insert
            if(searchNode.getData().equals(data)){
                  return searchNode;
            }else{
                  //Not Exist Node
                  System.out.println("찾는 데이터 없음");
                  return null;
            }
      }
      public void middleNodeInsert(String data, Node pre){
            Node insertNode = new Node(data);
            //head is null
            if(head == null){
                  head = insertNode;
                  insertNode.link = insertNode;
            }else{
                  Node temp = head;
                  //middle node insert
                  while(temp.link !=head){
                        if(pre == temp){
                              insertNode.link=pre.link;
                              pre.link = insertNode;
                              return;
                        }else{
                              temp = temp.link;
                        }
                  }
                  //last node insert
                  if(temp==pre){
                        insertNode.link = pre.link;
                        pre.link = insertNode;
                        return;
                  }else{
                        //not exist node
                        System.out.println("pre 노드가 존재하지 않습니다.");
                  }
            }
      }
      public void deletNode(Node deleteNode){
            Node temp = head;
            //FirstList Del
            if(temp == deleteNode){
                  Node headNode = head;
                  head = headNode.link;
                  while(temp.link != headNode){
                        temp = temp.link;
                  }
                  temp.link= head;
            }else{
                  // MiddelList Del
                  Node preNode =temp;
                  while(temp.link != head){
                        if(temp.link == deleteNode){
                              temp.link = deleteNode.link;
                              deleteNode.link=null;
                              return;
                        }else{
                              preNode =temp;
                              temp=temp.link;
                        }
                  }
                  if(temp == deleteNode){
                        //LastList Del
                        preNode.link =head;
                        deleteNode.link =null;
                  }else{
                        //Not Exist Node
                        System.out.println("해당 노드가 없음");
                        return;
                  }
            }
      }
      public void reverseList(){
            Node pre = null;
            Node current = null;
            Node next= head;
            Node headNode = head;
            if(next.link == head){
                  System.out.println("리스트의 길이가 1입니다. reverse할 길이가 안됩니다.");
                  return;
            }else if(head == null){
                  System.out.println("리스트의 길이가 0입니다. reverse할 길이가 안됩니다.");
                  return;
            }
            while(next.link != head){
                  pre = current;
                  current = next;
                  next = next.link;
                  current.link = pre;
            }
            //head setting
            pre = current;
            current = next;
            current.link = pre;
            headNode.link = current;
            head = current;
      }
}
'플밍 is 뭔들 > 자료구조' 카테고리의 다른 글
| 03-1 스택 (0) | 2016.11.25 | 
|---|---|
| 02-4 이중 연결 리스트 (0) | 2016.11.25 | 
| 02-2 단순 연결 리스트 (0) | 2016.11.25 | 
| 02-1 연결 자료구조 방식 (0) | 2016.11.25 | 
| 01-3 행열의 순차 자료구조 표현 (0) | 2016.11.25 |