๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Programming/Data Constructure

[์ž๋ฃŒ๊ตฌ์กฐ] Linked List๋ž€? - Java ๊ตฌํ˜„

728x90
๋ฐ˜์‘ํ˜•

์ˆœ์„œ

Linked list(๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ) ๋ž€?

   ใ„ด Linked list์™€ List์˜ ์ฐจ์ด์ 

   ใ„ด Single Linked List์™€ Doubly Linked List ์ฐจ์ด์ (Doubly Linked List๊ฐ€ ํ•„์š”ํ•œ ์ด์œ )

Single Linked list ๊ตฌํ˜„(JAVA)

Doubly Linked list ๊ตฌํ˜„(JAVA)

 

๐Ÿค” Linked list ๋ž€ ๋ฌด์—‡์ธ๊ฐ€?

List์™€์˜ ์ฐจ์ด์ 

์—ฐ๊ฒฐ๋œ ๋ฆฌ์ŠคํŠธ๋ž€ ์˜๋ฏธ๋ฅผ ๊ฐ€์ง€๋Š” ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ๋Š” ์ผ๋ฐ˜ ๋ฆฌ์ŠคํŠธ(List)์™€ ์ฐจ์ด์ ์„ ๋ณด๋ฉด์„œ ์ด์•ผ๊ธฐํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๊ธฐ๋ณธ์ ์ธ List๋Š” ์ˆœ์ฐจ์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋œ ๋ฐฐ์—ด ๊ตฌ์กฐ์ด๋‹ค.

 

List ๊ตฌ์กฐ

index(์ˆœ์„œ) 0 1 2 3 4 5
value(๊ฐ’) "์ฒซ๋ฒˆ์งธ ๊ฐ’" "๋‘๋ฒˆ์งธ ๊ฐ’" "์„ธ๋ฒˆ์งธ ๊ฐ’" "๋„ค๋ฒˆ์งธ ๊ฐ’" "๋‹ค์„ฏ๋ฒˆ์งธ ๊ฐ’" "์—ฌ์„ฏ๋ฒˆ์งธ ๊ฐ’"

์œ„ ํ‘œ์™€ ๊ฐ™์€ List๊ฐ€ ์ €์žฅ๋˜์–ด์žˆ๋‹ค๋ฉด ํ•ด๋‹น ๋ฆฌ์ŠคํŠธ๋Š” ["์ฒซ๋ฒˆ์งธ ๊ฐ’", "๋‘๋ฒˆ์งธ ๊ฐ’", "์„ธ๋ฒˆ์งธ ๊ฐ’", "๋„ค๋ฒˆ์งธ ๊ฐ’" ...] ์™€ ๊ฐ™์ด ์ˆœ์ฐจ์ ์œผ๋กœ ๊ฐ’์„ ๊ฐ–๋Š” ๊ฒƒ์ด๋‹ค. (์ˆœ์„œ๋Œ€๋กœ ๋น„์–ด์žˆ๋Š” ๊ณต๊ฐ„์— ์ €์žฅ)

 

ํ•˜์ง€๋งŒ, ์ผ๋ฐ˜์ ์ธ List์˜ ๊ฒฝ์šฐ ์„ ์–ธํ•  ๋‹น์‹œ์— ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๋ฅผ ์ •ํ•ด์ค˜์•ผํ•œ๋‹ค.

ex) String[] list = String[6];  => ํฌ๊ธฐ๊ฐ€ 6์ธ ๋ฌธ์ž์—ด ๋ฐฐ์—ด

 

๊ทธ๋ ‡๊ธฐ์— ๋ฉ”๋ชจ๋ฆฌ๋Š” ๋‚ญ๋น„ํ•˜์ง€ ์•Š๊ธฐ ์œ„ํ•ด์„œ ํ•„์š”ํ•œ ํฌ๊ธฐ๋งŒํผ๋งŒ ์ •์˜ํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š”๊ฒŒ ํšจ์œจ์ ์ธ๋ฐ ๋งŒ์ผ, ๊ฐ€๋ณ€์ ์œผ๋กœ ํฌ๊ธฐ๊ฐ€ ๋ณ€ํ•ด์•ผํ•˜๋Š” ์ƒํ™ฉ์ด๋ผ๋ฉด, ์ด ์ฒ˜๋Ÿผ List๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๊ฒŒ ์‰ฝ์ง€ ์•Š๋‹ค.

 

Linked List๋Š” ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๋ฅผ ๋ฏธ๋ฆฌ ์ •ํ•ด์ฃผ์ง€ ์•Š๊ณ  ํ•„์š”ํ•  ๋•Œ ๋งˆ๋‹ค ๋…ธ๋“œ(node)๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์—ฐ๊ฒฐํ•ด ์คŒ์œผ๋กœ์„œ ๊ฐ€๋ณ€์ ์ธ ์ƒํ™ฉ์— ๋Œ€์ฒ˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์—ฌ๊ธฐ์„œ ๋…ธ๋“œ๋ž€, ํ•˜๋‚˜์˜ ๊ฐ’(value)๋ฅผ ๊ฐ–๊ณ  ์žˆ๋Š” ๊ณต๊ฐ„์„ ์˜๋ฏธํ•œ๋‹ค. ์œ„์˜ List ํ…Œ์ด๋ธ”์—์„œ ํ•œ ์นธ์— ํ•˜๋‚˜์˜ value๋ฅผ ๊ฐ–๋Š”๋ฐ ์ด ๊ณต๊ฐ„์€ ๋…ธ๋“œ๋ผ๊ณ  ๋ณด๋ฉด ๋œ๋‹ค.

 

Linked List์˜ ๋ชจ์Šต์„ ๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

 

Single Linked List

 

node ์•ˆ์—๋Š” ๋ฐ์ดํ„ฐ ๊ฐ’์ธ value์™€ ๋‹ค๋ฅธ node์˜ ์œ„์น˜ ์ •๋ณด(์ปดํ“จํ„ฐ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ)๋ฅผ ๊ฐ€์ง„๋‹ค.

 

ํ•˜๋‚˜์˜ node๋ฅผ ์•Œ๋ฉด ๋‹ค๋ฅธ node๋“ค์„ ๋ชจ๋‘ ์ฐพ์•„๊ฐˆ ์ˆ˜ ์žˆ๋‹ค. ์ถ”๊ฐ€์ ์ธ data๋ฅผ ์ €์žฅํ•  ํ•„์š”๊ฐ€ ์žˆ์„ ๋•Œ node๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๋งจ ๋ pointer์— ์ƒˆ๋กœ์šด Node์˜ ์œ„์น˜๋ฅผ ์ €์žฅํ•˜๋ฉด ์—ฐ๊ฒฐ๋œ ๊ตฌ์กฐ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

 

์ด๋ ‡๊ฒŒ ํ•˜๋‚˜์˜ ๋…ธ๋“œ๊ฐ€ ๋ฐ์ดํ„ฐ ๊ฐ’๊ณผ ๋‹ค๋ฅธ ๋…ธ๋“œ์˜ ์œ„์น˜ ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉด Linked List๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์œ„ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ํ•˜๋‚˜์˜ pointer(๋‹ค์Œ ์ˆœ์„œ์˜ node ์œ„์น˜ ์ •๋ณด)๋ฅผ ๊ฐ€์ง€๋ฉด Single Linked List๋ผ๊ณ  ํ•œ๋‹ค.

์œ„ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด pointer๊ฐ€ 2๊ฐœ ์กด์žฌํ•ด ์ด์ „ node์˜ ์œ„์น˜ ์ •๋ณด์™€ ๋‹ค์Œ node์˜ ์œ„์น˜ ์ •๋ณด๋ฅผ ๋ชจ๋‘ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” node๋“ค์ด ์„œ๋กœ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋‹ค๋ฉด Doubly Linked List๋ผ๊ณ  ํ•œ๋‹ค.

 

๊ทธ๋Ÿผ Doubly Linked List๋Š” ์™œ ํ•„์š”ํ• ๊นŒ?

Single Linked List์˜ ๊ฒฝ์šฐ pointer๊ฐ€ ์ž์‹ ์˜ ๋‹ค์Œ node๋งŒ์„ ๊ฐ€๋ฅดํ‚ค๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋“  ๊ฐ’์„ ์กฐํšŒ, ์‚ฝ์ž…, ์‚ญ์ œํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๊ธฐ์ค€์ด ๋  ์ˆ˜ ์žˆ๋Š” ์ œ์ผ ์•ž์˜ node (์—ฌ๊ธฐ์„  head)๋ฅผ ์•Œ์•„์•ผ ํ•œ๋‹ค.

 

ํŠน์ • node๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•ด์„œ๋Š” head๋ฅผ ์‹œ์ž‘์œผ๋กœ ์ฐพ์„ data์™€ ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ์•„๋‹ ๊ฒฝ์šฐ head์˜ pointer์—์„œ ๋‹ค์Œ node์˜ ์œ„์น˜๋ฅผ ํ™•์ธํ•˜๊ณ  ์ด๋™ํ•ด ๋‹ค์‹œ data๊ฐ€ ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ์„ ๋ฐ˜๋ณตํ•ด์•ผ ํ•œ๋‹ค.

๋งŒ์•ฝ์— ์ฐพ์•„์•ผํ•  ๊ฐ’์ด node์˜ ๋๋ถ€๋ถ„์— ์žˆ์—ˆ๋‹ค๋ฉด  ์ƒ๋‹นํžˆ ๋น„ํšจ์œจ์ ์ด๊ฒŒ ๋œ๋‹ค. ์ฐพ์•„์•ผํ•  ๋ฐ์ดํ„ฐ๊ฐ€  ์•ž์—์žˆ์„์ง€ ๋’ค์— ์žˆ์„์ง€ ์˜ˆ์ธกํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด, ์–‘์ชฝ์—์„œ ๋ชจ๋‘ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด ํšจ์œจ์ ์ผ ๊ฒƒ์ด๋‹ค.

 

์ด๋•Œ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•œ ๊ฒƒ์ด doubly Linked List์ด๋‹ค.

 

Doubly Linked List์˜ ๊ฒฝ์šฐ, pointer๋กœ ์•ž์˜ node์™€ ๋’ค์˜ node๋ฅผ ๋ชจ๋‘ ํ™•์ธํ•  ์ˆ˜ ์žˆ์–ด์„œ ์ƒํ™ฉ์— ๋งž๊ฒŒ ๋’ค์—์„œ ํƒ์ƒ‰์„ํ•  ๊ฒƒ์ธ์ง€ ๋งจ ์•ž์—์„œ ํƒ์ƒ‰์„ํ•  ๊ฒƒ์ธ์ง€ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๐Ÿ˜ƒ Single Linked List ๊ตฌํ˜„ํ•˜๊ธฐ for Java

public class SingleLinkedList<T> {

    // ๊ธฐ์ค€์ด ๋˜๋Š” ๊ฐ€์žฅ ์ฒซ๋ฒˆ์งธ node
    public Node<T> head = null;

    // ๋‚ด์žฅ ๊ฐ์ฒด Node ์ •์˜
    public class Node<T> {
        T data;
        Node<T> next = null;

        // Node class์˜ ์ƒ์„ฑ์ž
        public Node(T data) {
            this.data = data;
        }
    }

    // ๋งจ ๋ ๋‹จ์— ๋…ธ๋“œ ์ถ”๊ฐ€
    public void addNode(T newData) {
        if(head == null) {  // List๋Š” ๋น„์–ด์žˆ๋Š” ์ƒํƒœ
            head = new Node<>(newData);
        }
        else {  // ๋น„์–ด์žˆ์ง€ ์•Š๋‹ค๋ฉด ๊ฐ€์žฅ ๋ node๋ฅผ ํƒ์ƒ‰
            // head ๋กœ ์ด๋™
            Node<T> node = this.head;
            // node์˜ next๊ฐ€ null ์ผ ๋•Œ ๊นŒ์ง€
            while (node.next != null) {
                node = node.next;
            }
            // ๋‹ค์Œ ๋งํฌ๋ฅผ ์—ฐ๊ฒฐ
            node.next = new Node<T>(newData);
        }
    }

    // ๋…ธ๋“œ ์ค‘๊ฐ„ ์ถ”๊ฐ€
    public void insertNode(T data, T where){    // data: ์‚ฝ์ž…ํ•  ๋ฐ์ดํ„ฐ, where: ์‚ฝ์ž…ํ•  ๋ฐ์ดํ„ฐ์˜ ๊ธฐ์ค€ ์œ„์น˜ 
        Node<T> searchNode = this.search(where);
        if (searchNode == null) {
            this.addNode(data);
        } else {
            Node<T> nextNode = searchNode.next; 
            searchNode.next = new Node<>(data); // ๊ธฐ์ค€์  ๋’ค์— ์‚ฝ์ž…
            searchNode.next.next = nextNode;    // ์ƒˆ๋กœ ์‚ฝ์ž…ํ•œ ๋ฐ์ดํ„ฐ์— ๊ธฐ์ค€์ ์˜ ๊ธฐ์กด next๋ฅผ ์‚ฝ์ž…
        }
    }

    // node ๊ฒ€์ƒ‰
    public Node<T> search(T where) {
        if (this.head == null) {
            return null;
        } else {
            Node<T> node = head;
            while(node.next != null) {
                if(node.data == where){
                    return node;
                } else {
                    node = node.next;
                }
            }
            // ๋ชจ๋“  ํƒ์ƒ‰ ํ›„ ์—†๋‹ค๋ฉด null ๋ฆฌํ„ด
            return null;
        }
    }

    // node ์‚ญ์ œ ๋ฉ”์†Œ๋“œ
    public boolean delNode(T data) {
        if(this.head == null) {
            return false;
        } else {
            Node<T> node = this.head;
            if(node.data == data) {
                this.head = this.head.next;
                return true;
            } else {
                // node ์ด๋™
                while(node.next != null) {
                    if(node.next.data == data) {
                        node.next = node.next.next;
                        return true;
                    } else {
                        node = node.next;
                    }
                    // ๋ชจ๋“  ํƒ์ƒ‰์„ ๋งˆ์นœ ํ›„ ์—†์œผ๋ฉด false;
                }
                return false;
            }
        }
    }
 }

 

๐Ÿ˜ƒ Doubly Linked List ๊ตฌํ˜„ํ•˜๊ธฐ for Java

public class DoublyLinkedList<T> {
    public Node<T> head;    // ๊ฐ€์žฅ ์•ž์˜ node
    public Node<T> tail;    // ๊ฐ€์žฅ ๋’ค์˜ node

    // ๋‚ด์žฅ ๊ฐ์ฒด node
    public class Node<T>{
        T data;
        Node<T> prev;   // ์•ž node์˜ pointer
        Node<T> next;   // ๋’ค node์˜ pointer

        public Node(T data) {   // ์ƒ์„ฑ์ž
            this.data = data;
        }
    }

    // ๋งจ ๋์— node ์ถ”๊ฐ€ํ•˜๊ธฐ
    public void addNode(T data) {
        if(this.head == null){
            this.head = new Node<>(data);
            this.tail = this.head;
        } else {
            Node<T> node = head;
            while(node.next != null){
                node = node.next;
            }
            node.next = new Node<>(data);
            node.next.prev = node;
            this.tail = node.next;
        }
    }

    // head์—์„œ ํŠน์ • ๊ฐ’ ์ฐพ๊ธฐ
    public T findFromHead(T data) {
        if(this.head != null) {
            Node<T> node = head;
                while(node != null) {
                    if(node.data == data) {
                        return node.data;
                    } else {
                        node = node.next;
                }
            }
            return null;
        }
        return null;
    }

    // ๋งจ ๋’ค node์—์„œ ํŠน์ • ๊ฐ’ ์ฐพ๊ธฐ
    public T findFromTail(T data) {
        if(this.tail != null) {
            Node<T> node = this.tail;
                while(node != null) {
                    if(node.data == data){
                        return node.data;
                    } else {
                        node = node.prev;
                }
            }
            return null;
        }
        return null;
    }

    // param์˜ ๊ฐ’์„ ๊ฐ€์ง€๋Š” Node์— node ์ถ”๊ฐ€ํ•˜๊ธฐ(head ์—์„œ๋ถ€ํ„ฐ ์ฐพ๊ธฐ)
    public boolean addNodeToFront(T addData, T targetData){
        if(this.head == null) {
            this.head = new Node<>(addData);
            this.tail = this.head;
            return true;
        } else if(this.head.data == targetData) {
            Node<T> newHead = new Node<>(addData);
            newHead.next = this.head;
            this.head = newHead;
            this.head.next.prev = this.head;
            return true;
        } else {
            Node<T> node = this.head;
            while (node != null) {
                if(node.data == targetData){
                    Node<T> addNode = new Node<>(addData);
                    addNode.prev = node.prev;
                    addNode.next = node;
                    node.prev.next = addNode;
                    node.prev = addNode;
                    return true;
                } else{
                    node = node.next;
                }
            }
            return false;
        }
    }
}
728x90
๋ฐ˜์‘ํ˜•