• ํŒจ์ŠคํŠธ์บ ํผ์Šค ์ฑŒ๋ฆฐ์ง€ 19์ผ์ฐจ

    2021. 11. 19.

    by. JuneBee

    728x90
    ๋ฐ˜์‘ํ˜•

    ๊ฐ•์˜ ๋‚ ์งœ: 11/19/2021
    ์‹œ์ฒญ ๊ฐ•์˜: ์€๊ทผํžˆ ์–ด๋ ค์šด ์ž๋ฃŒ๊ตฌ์กฐ : ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ(2)

    ์˜ค๋Š˜ ๊ฐ•์˜์—์„œ๋Š” ์–ด์ œ ์ •๋ฆฌํ•ด๋†“์€ ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ ๊ตฌํ˜„ํ•˜๊ธฐ์— ๋Œ€ํ•œ ๋‚ด์šฉ์ด์—ˆ๋‹ค. ์ด๋ฏธ ์–ด์ œ ์ •๋ฆฌํ–ˆ๊ณ , ๋‚ด์šฉ์ด ๋งŽ์ด ๋ถ€์กฑํ•œ ๊ฒƒ ๊ฐ™์•„ ์ด์ค‘ ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ์— ๋Œ€ํ•ด ์ •๋ฆฌํ•˜๊ฒ ๋‹ค.

    Doubly LinkedList (์ด์ค‘ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ)

    ์ด์ค‘ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋Š” ํ•˜๋‚˜์˜ ๋…ธ๋“œ์— ๋‘ ๊ฐœ์˜ ๋งํฌ๊ฐ€ ์กด์žฌํ•œ๋‹ค.

    1. ๊ฐ ๋…ธ๋“œ๋Š” ์ด์ „ ๋…ธ๋“œ์˜ ์ฐธ์กฐ ๋งํฌ์™€, ๋‹ค์Œ ๋…ธ๋“œ์˜ ์ฐธ์กฐ๋งํฌ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค
    2. ์ „์ฒด ๋…ธ๋“œ๋ฅผ ์ˆœํšŒํ•ด์•ผ ์ด์ „ ๋…ธ๋“œ๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ๋Š” ๋‹จ์ผ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์™€๋Š” ๋‹ค๋ฅด๊ฒŒ, ์ด์ค‘ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋Š” ์ด์ „ ๋…ธ๋“œ์˜ ๋งํฌ๋ฅผ ํ†ตํ•ด O(1)์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋กœ ์ด์ „ ๋…ธ๋“œ๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค
    3. ๋…ธ๋“œ์˜ ์ถ”๊ฐ€์™€ ์ œ๊ฑฐ๊ฐ€ ๋‹จ์ผ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋ณด๋‹ค ๋งŽ์€ ์ž‘์—…์„ ํ•ด์•ผ ํ•œ๋‹ค
    4. ์ž‘์—…์ด ๋” ๋‹จ์ˆœํ•˜๊ณ  ์ž ์žฌ์ ์œผ๋กœ ๋” ํšจ์œจ์ ์ด๋‹ค

    ๊ตฌํ˜„

    ์•„๋ž˜ ์ฝ”๋“œ๋Š” ์œ„์˜ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์˜ ๊ธฐ๋ณธ ๊ตฌ์กฐ - head, next, previous links๋ฅผ ํ‘œํ˜„ํ•œ ์ฝ”๋“œ์ด๋‹ค

    ๋…ธ๋“œ ํ‘œํ˜„

    public class DLL {
        Node head; // head of list
    
        /* Doubly Linked list Node*/
        class Node {
            int data;
            Node prev;
            Node next;
            Node(int d) { data = d; } //next ์™€ prev ์€ null๋กœ ์ดˆ๊ธฐํ™”๋œ๋‹ค
        }
    }

    ๋งจ ์•ž์— ๋…ธ๋“œ ์ถ”๊ฐ€

    // ๋งจ ์•ž์— ๋…ธ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ์ฝ”๋“œ
    public void push(int new_data)
    {
        Node new_Node = new Node(new_data);
    
         /*์ƒˆ๋กœ ์ถ”๊ฐ€ํ•˜๋ ค๋Š” ๋…ธ๋“œ์˜ ๋‹ค์Œ ํฌ์ธํ„ฐ๋ฅผ ๊ธฐ์กด์˜ head๋ฅผ ์ฐธ์กฐํ•˜๊ฒŒ ๋งŒ๋“ค๊ณ 
          *์ด์ „ ํฌ์ธํ„ฐ๋Š” Null ๋กœ ๋งŒ๋“ ๋‹ค-> ์ฆ‰ ์ž๊ธฐ์ž์‹ ์„ head๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ*/
        new_Node.next = head;
        new_Node.prev = null;
    
        /* ๊ธฐ์กด Head์˜ ์ด์ „ ์ฐธ์กฐ๊ฐ’์ด ์ƒˆ๋กœ ์ƒ์„ฑํ•œ ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋„๋ก ํ•œ๋‹ค*/ 
        if (head != null)
            head.prev = new_Node;
    
        /* Head๊ฐ€ ์ƒˆ๋กœ ์ƒ์„ฑ๋œ ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ํ•œ๋‹ค */
        head = new_Node;
    }
    

    ํŠน์ • ๋…ธ๋“œ ๋’ค์— ์ƒˆ๋กœ์šด ๋…ธ๋“œ ์ถ”๊ฐ€

    //์ฃผ์–ด์ง„ ๋…ธ๋“œ ๋’ค์— ์ƒˆ ๋…ธ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ตฌํ˜„์ด๋‹ค
    //์ด์ „ ๋…ธ๋“œ๊ฐ€ ๋น„์–ด์žˆ์œผ๋ฉด ์ถ”๊ฐ€ํ•  ์ˆ˜ ์—†๋‹ค
    public void InsertAfter(Node prev_Node, int new_data)
    {
            if (prev_Node == null) {
            System.out.println("The given previous node cannot be NULL ");
            return;
        }
     //์ƒ์„ฑ ๊ฐ€๋Šฅํ•œ ์œ„์น˜
        Node new_node = new Node(new_data);
    
        /* ์ถ”๊ฐ€๋˜๊ธฐ ์ „์˜ ๋…ธ๋“œ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋˜ ๋‹ค์Œ ๊ฐ’์„ ์ถ”๊ฐ€ํ•˜๋ ค๋Š” ๋…ธ๋“œ์˜ ๋‹ค์Œ๊ฐ’์œผ๋กœ ์„ธํŒ…ํ•œ๋‹ค
             * ex: 1  2  3  ___  4 : ๋นˆ์นธ์— ๋…ธ๋“œ๋ฅผ ๋„ฃ์œผ๋ ค๋ฉด, ์›๋ž˜๋Š” 3์ด 4๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ์—ˆ์ง€๋งŒ
         * ๋นˆ์นธ์— ๋“ค์–ด๊ฐˆ ๋…ธ๋“œ๊ฐ€ 4๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋„๋ก ์ง€์ •ํ•ด์•ผ ํ•œ๋‹ค */
    
        new_node.next = prev_Node.next; 
    
        /* ์ฃผ์–ด์ง„ ๋…ธ๋“œ์˜ ๋‹ค์Œ ์ฐธ์กฐ ํฌ์ธํ„ฐ๊ฐ€ ์ƒˆ๋กœ ์ถ”๊ฐ€ํ•  ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋„๋ก ํ•œ๋‹ค
             * ex: 1  2  3  ___ 4 : 3์€ ๋นˆ์นธ(์ƒˆ๋กœ์ถ”๊ฐ€ํ•˜๋ ค๋Š”๋…ธ๋“œ)์„ ๊ฐ€๋ฅด์ผœ์•ผํ•œ๋‹ค*/
        prev_Node.next = new_node;
    
        /* ์ถ”๊ฐ€ํ•œ ๋…ธ๋“œ์˜ ์ด์ „ ์ฐธ์กฐ ํฌ์ธํ„ฐ๋Š” ์•ž์˜ ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋„๋ก ํ•œ๋‹ค
             *  ex: 1  2  3  ___ 4: ์ƒˆ๋กœ ์ถ”๊ฐ€ํ•œ ๋…ธ๋“œ์˜ ์ด์ „์ฐธ์กฐํฌ์ธํ„ฐ๋Š” 3์„ ๊ฐ€๋ฆฌ์ผœ์•ผํ•œ๋‹ค */
        new_node.prev = prev_Node;
    
        /*์ถ”๊ฐ€ํ•œ ๋…ธ๋“œ์˜ ๋‹ค์Œ ๋…ธ๋“œ์˜ ์ด์ „ ์ฐธ์กฐ ํฌ์ธํ„ฐ๊ฐ€ ์ƒˆ๋กœ ์ถ”๊ฐ€๋œ ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ฒŒํ•œ๋‹ค */
        if (new_node.next != null)
            new_node.next.prev = new_node;
    }
    

    ๋งจ ๋’ค์— ์ƒˆ๋กœ์šด ๋…ธ๋“œ ์ถ”๊ฐ€

    //๋งจ ๋’ค์— ๋…ธ๋“œ ์ƒ์„ฑ
    void append(int new_data)
    {
        Node new_node = new Node(new_data); //์ƒˆ ๋…ธ๋“œ
    
        Node last = head; //while ๋ฃจํ”„ ์•ˆ์—์„œ ์“ฐ์ž„
    
        // ์ƒˆ ๋…ธ๋“œ๋Š” ๋งˆ์ง€๋ง‰์— ์ถ”๊ฐ€ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค์Œ ์ฐธ์กฐ๊ฐ’์€ null์„ ๊ฐ€์ง„๋‹ค
        new_node.next = null;
    
        // ๋ฆฌ์ŠคํŠธ๊ฐ€ ๋น„์–ด์žˆ๋‹ค๋ฉด, ์ƒˆ๋กœ ์ถ”๊ฐ€ํ•˜๋ ค๋Š” ๋…ธ๋“œ๋Š” ํ—ค๋“œ๊ฐ€ ๋œ๋‹ค
        if (head == null) {
            new_node.prev = null;
            head = new_node;
            return;
        }
    
        // ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ๊นŒ์ง€ ์ˆœํšŒํ•œ๋‹ค
        while (last.next != null)  //์›๋ž˜ ํ•ด๋“œ์˜ ๋‹ค์Œ ์ฐธ์กฐ๊ฐ’์ด ์กด์žฌํ•˜๋ฉด
            last = last.next;    //๊ทธ ๋‹ค์Œ ๋…ธ๋“œ๋ฅผ ํ™•์ธํ•œ๋‹ค -> ์›๋ž˜ ๋ฆฌ์ŠคํŠธ์˜ ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰ ์›์†Œ ํ™•์ธ
    
        // ๊ธฐ์กด ๋ฆฌ์ŠคํŠธ์˜ ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ์˜ next pointer ๋ฅผ ์ƒˆ๋กœ ์ถ”๊ฐ€ํ•œ ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ฒŒํ•œ๋‹ค
        last.next = new_node;
    
        // ์ƒˆ๋กœ ์ถ”๊ฐ€ํ•œ ๋…ธ๋“œ์˜ ์ด์ „๊ฐ’์€ ๊ธฐ์กด ๋ฐฐ์—ด์˜ ๋งˆ์ง€๋ง‰์„ ๊ฐ€๋ฆฌํ‚จ๋‹ค
        new_node.prev = last;
    

    ###๋…ธ๋“œ ์‚ญ์ œ

    //๋…ธ๋“œ ์‚ญ์ œ
    void deleteNode(Node del)
     {       // Base case: head ๋‚˜ ์‚ญ์ œํ•˜๋ ค๋Š” ๋…ธ๋“œ๊ฐ€ null์ด๋ฉด ๋ฉˆ์ถค
            if (head == null || del == null) {
                return;
            }
    
            // ์ง€์šฐ๋ ค๋Š” ๋…ธ๋“œ๊ฐ€ head ๋…ธ๋“œ์ผ ๋•Œ:
            if (head == del) {
                head = del.next; //์ƒˆ๋กœ์šด ํ•ด๋“œ๋ฅผ ๊ธฐ์กด์˜ ์ง€์šฐ๋ ค๋Š” ํ—ค๋“œ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋‹ค์Œ ๋…ธ๋“œ๋กœ ์ง€์ •
            }
                    //ex: 3  2  1(del)  5 -> 1์€ 2๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋Š”๋ฐ, 5๊ฐ€ 1์„ ๊ฐ€๋ฆฌํ‚ค๋„๋ก ํ•ด์ค€๋‹ค
            if (del.next != null) {//์‚ญ์ œํ•˜๋ ค๋Š” ๋…ธ๋“œ๊ฐ€ ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด
                del.next.prev = del.prev; //์‚ญ์ œํ•˜๋ ค๋Š” ๋…ธ๋“œ์˜ ์ด์ „ ์ฐธ์กฐ๊ฐ’์ด ์‚ญ์ œํ•˜๋ ค๋Š” ๋…ธ๋“œ์˜ ์ด์ „ ํƒ์ƒ‰๊ฐ’์„ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ํ•œ๋‹ค
            }
    
            //ex : 3  2  1(del)  5 -> 2๊ฐ€ 5๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ํ•ด๋ˆˆ๋‹ค
            if (del.prev != null) { //์‚ญ์ œํ•˜๋ ค๋Š” ๋…ธ๋“œ๊ฐ€ ํ—ค๋“œ๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด
                del.prev.next = del.next; //์‚ญ์ œํ•˜๋ ค๋Š” ๋…ธ๋“œ์˜ ์ด์ „๋…ธ๋“œ๊ฐ€ ์‚ญ์ œํ•˜๋ ค๋Š” ๋…ธ๋“œ์˜ ๋‹ค์Œ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ํ•œ๋‹ค
            }
    
            return; //free the memory
        }

    code reference : Geeks for Geeks


    ํŒจ์ŠคํŠธ์บ ํผ์Šค ํ™˜๊ธ‰ ์ฑŒ๋ฆฐ์ง€ ๋ฐ”๋กœ๊ฐ€๊ธฐ๐Ÿ‘‰ https://bit.ly/3FVdhDa

     

    ์ˆ˜๊ฐ•๋ฃŒ 100% ํ™˜๊ธ‰ ์ฑŒ๋ฆฐ์ง€ | ํŒจ์ŠคํŠธ์บ ํผ์Šค

    ๋”ฑ 5์ผ๊ฐ„ ์ง„ํ–‰๋˜๋Š” ํ™˜๊ธ‰์ฑŒ๋ฆฐ์ง€๋กœ ์ˆ˜๊ฐ•๋ฃŒ 100% ํ™˜๊ธ‰๋ฐ›์œผ์„ธ์š”! ๋” ๋Šฆ๊ธฐ์ „์— ์ž๊ธฐ๊ณ„๋ฐœ ๋ง‰์ฐจ ํƒ‘์Šน!

    fastcampus.co.kr

    ๋ณธ ํฌ์ŠคํŒ…์€ ํŒจ์ŠคํŠธ์บ ํผ์Šค ํ™˜๊ธ‰ ์ฑŒ๋ฆฐ์ง€ ์ฐธ์—ฌ๋ฅผ ์œ„ํ•ด ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

    728x90
    ๋ฐ˜์‘ํ˜•

    ๋Œ“๊ธ€