• ํŒจ์ŠคํŠธ์บ ํผ์Šค ์ฑŒ๋ฆฐ์ง€ 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
    ๋ฐ˜์‘ํ˜•

    ๋Œ“๊ธ€