Single Linked List


Single Linked List(단일 연결 리스트)는 자료들을 반드시 연속적으로 배열시키지 않고 임의의 기억공간에 기억시키되, 자료 항목의 순서에 따라 노드의 포인터 부분을 이용하여 서로 연결시킨 자료 구조이다.

 

-header : 리스트의 가장 첫번째에 위치하는 Node이며 Node를 찾기 위해서는 header부터 탐색을 해야한다

-Node(노드) : 데이터 저장 단위(데이터값, 포인터)로 구성

-Pointer(포인터) : 각 노드 안에서 다음이나 이전의 노드와의 연결 정보를 가지고 있는 공간

Single Linked List의 특징


  • 노드의 삽입, 삭제 작업이 용이하다.
  • 배열은 미리 데이터 공간을 할당 해야 하지만 링크드 리스트는 미리 데이터 공간을 할당하지 않아도 된다.
  • 연결을 위한 링크(포인터) 부분이 필요하기 때문에 순차 리스트에 비해 기억공간 이용 효율이 좋지 않다.
  • 연결을 위한 포인터를 찾는 시간이 필요하기 때문에 접근 속도가 느리다.
  • 중간 노드 연결이 끊어지면 그 다음 노드를 찾기 힘들다.
  • 트리를 표현할 때 가장 적합한 자료 구조이다.

 

Single Linked List 구현해보기


public class SingleLinkedList<T> {
    
    //Linked List의 head
    public Node<T> head = null;
    
    //각각의 Node를 구현한 inner class
    public class Node<T> {
        T data;
        //다음의 Node 주소가 저장되는 pointer
        Node<T> next = null;
        
        public Node(T data) {
            this.data = data;                          
        }
    }
    
    //Node를 추가하는 메소드
    public void addNode(T data) {
        if (head == null) {
            //head가 null 즉 처음 들어온 data인 경우 head에 data 추가
            head = new Node<T>(data);
        } else {
            //첫 Node를 시작으로 마지막 Node까지 찾아가는 과정
            Node<T> node = this.head;
            while (node.next != null) {
                node = node.next;
            }
            //마지막 Node에 왔을 시 마지막 Node의 next에 parameter로 받은 data를 대입 
            node.next = new Node<T>(data);
        }
    }
    
    //모든 Linked List를 보여주는 메소드
    public void printAll() {
        if (head != null) {
            Node<T> node = this.head;
            System.out.println(node.data);
            while (node.next != null) {
                node = node.next;
                System.out.println(node.data);
            }
        }
    }
    
    //찾고싶은 Node를 검색하는 메소드
    public Node<T> search(T data) {
        if (this.head == null) {
            return null;
        } else {
            Node<T> node = this.head;            
            while (node != null) { 
                if (node.data == data) {
                    return node;
                } else {
                    node = node.next;
                }
            }
            return null;
        }
    }
    
    //existedData뒤에 addData를 추가하는 메소드
    public void addNodeInside(T existedData, T addData) {
        Node<T> searchedNode = this.search(existedData);
        
        if (searchedNode == null) {
            //검색된 data가 없으면 마지막에 Node 추가
            this.addNode(addData);
        } else {
            //스와핑
            Node<T> nextNode = searchedNode.next;
            searchedNode.next = new Node<T>(addData);
            searchedNode.next.next = nextNode;
        }
    }
    
    //Node를 삭제하는 메소드
    public boolean delNode(T data) {
        if (this.head == null) {
            return false;
        } else {
            Node<T> node = this.head;
            if (node.data == data) {
                //head와 일치할 경우 head의 다음 Node를 head로 변경
                this.head = this.head.next;
                return true;
            } else {
                while (node.next != null) {
                    if (node.next.data == data) {
                        node.next = node.next.next;
                        return true;
                    }
                    node = node.next;
                }
                return false;
            }
        }
    }
}

'자료구조' 카테고리의 다른 글

Hash Table  (0) 2021.10.24
Double Linked List  (0) 2021.10.15
Stack  (0) 2021.10.15
Queue  (0) 2021.10.15
알고리즘 복잡도 표현 방법  (0) 2021.10.15

+ Recent posts