IT/development

[java] ์ง์ ‘ ๊ตฌํ˜„ํ•˜๋Š” ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ > ์ถ”๊ฐ€, ์‚ญ์ œ ๊ธฐ๋Šฅ (feat. ์ž๋ฃŒ๊ตฌ์กฐ)

์–ดํฅ๊ผฌ๋น„ 2025. 1. 5.

๋ชฉ์ฐจ

    ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ์˜ ์ถ”๊ฐ€, ์‚ญ์ œ ์›๋ฆฌ๋Š” ์ •๋ง ๊ฐ„๋‹จํ•œ๋ฐ ๊ทธ ์ถ”์ƒ์ ์ธ ๊ฐœ๋…์„ ๋จธ๋ฆฟ์†์œผ๋กœ ๊ทธ๋ฆฌ๋Š”๊ฒŒ ๋„ˆ๋ฌด ์˜ค๋ž˜ ๊ฑธ๋ ธ๋‹ค.

    source code

    package collection.link;
    
    public class MyLinkedListV2 {
    
        private Node first;
        private int size = 0;
    
        //๋งˆ์ง€๋ง‰ ์ธ๋ฑ์Šค์— ๊ฐ’์„ ์ถ”๊ฐ€
        public void add(Object e) {
            Node newNode = new Node(e);
            if(first == null) {
                first = newNode;
            } else {
                getLastNode().next = newNode;
            }
            size++;
        }
    
        //์ถ”๊ฐ€ ์ฝ”๋“œ
        public void add(int index, Object e) {
            Node newNode = new Node(e);
            //์ œ์ผ ์ฒ˜์Œ
            if(index ==0) {
                newNode.next = first;
                first = newNode;
            } else {
                /*
                ๋‚ด ์ง์ „ ๋…ธ๋“œ(index -1)๋ฅผ ๊ตฌํ•œ ๋’ค ์ง์ „ ๋…ธ๋“œ์˜ next๊ฐ’์„ ์‹ ๊ทœ ๋…ธ๋“œ์˜ next๊ฐ’์œผ๋กœ ๋„ฃ๊ณ 
                ์ง์ „ ๋…ธ๋“œ์˜ next๊ฐ€ ์‹ ๊ทœ ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋„๋ก ๋ณ€๊ฒฝํ•œ๋‹ค.
                ex1)
                ์‹ ๊ทœ๋กœ ๋งŒ๋“  ๋…ธ๋“œ์˜ ์ฃผ์†Œ๊ฐ’์€ x04๋‹ค.
                ์ง์ „ ๋…ธ๋“œ์˜ next๋Š” x03 ์ฃผ์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ์—ˆ๋‹ค.
                ์‹ ๊ทœ๋กœ ๋งŒ๋“  ๋…ธ๋“œ์˜ next๊ฐ€ x03์„ ๊ฐ€๋ฆฌํ‚ค๋„๋ก ๋ณ€๊ฒฝํ•œ๋‹ค.(newNode.next = prev.next)
                ์ง์ „ ๋…ธ๋“œ์˜ next๋Š” ์‹ ๊ทœ ๋…ธ๋“œ์ฃผ์†Œ๊ฐ’์ธ x04๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋„๋ก ๋ณ€๊ฒฝํ•œ๋‹ค.(prev.next = newNode)
                ex2)
                0๋ฒˆ ์งธ ๋…ธ๋“œ:๋‘˜๋ฆฌ,
                1๋ฒˆ ์งธ ๋…ธ๋“œ: ๋˜์น˜,
                2๋ฒˆ ์งธ ๋…ธ๋“œ: ๋„์šฐ๋„ˆ
                ๋‘˜๋ฆฌ์˜ next๋Š” ๋˜์น˜๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ณ  ๋˜์น˜์˜ next๋Š” ๋„์šฐ๋„ˆ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ณ  ๋„์šฐ๋„ˆ๋ฅผ null์„ ๊ฐ€๋ฆฌํ‚จ๋‹ค.
                ์ด ๋•Œ 2๋ฒˆ ์งธ ๋…ธ๋“œ(ํ˜„์žฌ ๋„์šฐ๋„ˆ ์œ„์น˜)์— ํฌ๋™์ด๋ฅผ ์ถ”๊ฐ€ํ•˜๋ ค๊ณ  ํ•œ๋‹ค.
                ํฌ๋™์ด๋ฅผ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด ๋จผ์ € ์ง์ „ ๋…ธ๋“œ์ธ ๋˜์น˜๋ฅผ ์•Œ์•„์•ผ ํ•œ๋‹ค.
                ๋˜์น˜์˜ next๋Š” ๋„์šฐ๋„ˆ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋‹ค.
                ์ด์ œ ๋˜์น˜์˜ next์ฃผ์†Œ(๋„์šฐ๋„ˆ)๋ฅผ ์‹ ๊ทœ ๋…ธ๋“œ์ธ ํฌ๋™์ด์˜ next์— ๋„ฃ์–ด์„œ ํฌ๋™์ด๊ฐ€ ๋„์šฐ๋„ˆ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋„๋ก ํ•œ๋‹ค.
                ๊ทธ ๋‹ค์Œ ๋˜์น˜์˜ next๋Š” ํฌ๋™์ด๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋„๋ก ํ•˜๋ฉด ๋œ๋‹ค.
                */
                Node prev = getNode(index - 1);
                newNode.next = prev.next;
                //์ง์ „ ๋…ธ๋“œ์˜ next๊ฐ’์„ ์‹ ๊ทœ ๋…ธ๋“œ๋กœ ๋ฐ”๊ฟ”์ค€๋‹ค.
                prev.next = newNode;
            }
            size++;
        }
    
        private Node getLastNode() {
            Node x = first;
            while (x.next != null) {
                x = x.next;
            }
            return x;
        }
    
        public Object set(int index, Object e) {
            Node x = getNode(index);
            Object oldValue = x.item;
            x.item = e;
            return oldValue;
        }
    
        //์ถ”๊ฐ€ ์ฝ”๋“œ
        public Object remove(int index) {
            Node removeNode = getNode(index);
            Object removedItem = removeNode.item;
            //์ฒซ๋ฒˆ ์งธ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š”๊ฒŒ ๋‚ด๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋˜๊ฑธ๋กœ ๋ณ€๊ฒฝ
            if(index == 0) {    
                first = removeNode.next;
            //๋‚ด ์ง์ „ ๋…ธ๋“œ๊ฐ€ ๋‚ด๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋˜๊ฑธ๋กœ ๋ณ€๊ฒฝ    
            } else {
                Node prev = getNode(index - 1);
                prev.next = removeNode.next;
            }
            //๋‚ด ์•„์ดํ…œ null๋กœ, ๋‚ด๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋˜ ์ฃผ์†Œ๋„ null๋กœ
            removeNode.item = null;
            removeNode.next = null;
            size--;
            return removedItem;
        }
    
        public Object get(int index) {
            return getNode(index).item;
        }
    
        private Node getNode(int index) {
            Node x = first;
            for (int i = 0; i < index; i++) {
                x = x.next;
            }
            return x;
        }
    
        public int indexOf(Object e) {
            int index = 0;
            for (Node x = first; x != null; x = x.next) {
                if(e.equals(x.item)) {
                    return index;
                }
                index++;
            }
            return -1;
        }
    
        public int size() {
            return size;
        }
    
        @Override
        public String toString() {
            return "MyLinkedListV1{" +
                    "first=" + first +
                    ", size=" + size +
                    '}';
        }
    }

    ๋งˆ์ง€๋ง‰ ์ธ๋ฑ์Šค์— ๊ฐ’์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฑด ์‰ฌ์› ๋Š”๋ฐ ํŠน์ • ์ธ๋ฑ์Šค์— ๊ฐ’์„ ๋„ฃ๋Š” ๊ฑธ ์ดํ•ดํ•˜๋Š”๋ฐ ํ•œ์ฐธ ๊ฑธ๋ ธ๋‹ค.

    ๊ทธ๋ž˜์„œ ๊ทธ๋ฆผ ๊ทธ๋ฆฌ๋ฉด์„œ ์ฃผ์„์œผ๋กœ ์ •๋ฆฌํ•˜๋ฉฐ ๊ฒจ์šฐ ์ดํ•ด ํ–ˆ๋‹ค.

    ๊ทธ๋ž˜์„œ add(int index, Object e) ๋ถ€๋ถ„์˜ ์ฃผ์„์ด ๊ธธ๋‹ค.

    ์œ„ ๋ฉ”์„œ๋“œ๋ฅผ ์ดํ•ดํ•˜๋‹ˆ remove๋Š” ํ•œ๊ฒฐ ์‰ฌ์›Œ์„œ ์ฃผ์„์„ ๋‹ฌ์ง€ ์•Š์•˜๋‹ค.

    ์•„๋ž˜๋Š” ์ œ๋„ค๋ฆญ ํƒ€์ž…๊ณผ ์ค‘์ฒฉ ํด๋ž˜์Šค๋ฅผ ๋„์ž…ํ•œ ๋ฆฌํŒฉํ† ๋ง ์ฝ”๋“œ๋‹ค.

    Refactoring code

    package collection.link;
    
    // ์ œ๋„ค๋ฆญ ํƒ€์ž…์œผ๋กœ ์ˆ˜์ •
    public class MyLinkedListV3<E> {
    
        private Node<E> first;
        private int size = 0;
    
        //๋งˆ์ง€๋ง‰ ์ธ๋ฑ์Šค์— ๊ฐ’์„ ์ถ”๊ฐ€
        public void add(E e) {
            Node<E> newNode = new Node<>(e);
            if(first == null) {
                first = newNode;
            } else {
                Node<E> lastNode = getLastNode();
                lastNode.next = newNode;
            }
            size++;
        }
    
        //์ถ”๊ฐ€ ์ฝ”๋“œ
        public void add(int index, E e) {
            Node<E> newNode = new Node<>(e);
            //์ œ์ผ ์ฒ˜์Œ
            if(index ==0) {
                newNode.next = first;
                first = newNode;
            } else {
                Node<E> prev = getNode(index - 1);
                newNode.next = prev.next;
                //์ง์ „ ๋…ธ๋“œ์˜ next๊ฐ’์„ ์‹ ๊ทœ ๋…ธ๋“œ๋กœ ๋ฐ”๊ฟ”์ค€๋‹ค.
                prev.next = newNode;
            }
            size++;
        }
    
        private Node<E> getLastNode() {
            Node<E> x = first;
            while (x.next != null) {
                x = x.next;
            }
            return x;
        }
    
        public E set(int index, E e) {
            Node<E> x = getNode(index);
            E oldValue = x.item;
            x.item = e;
            return oldValue;
        }
    
        //์ถ”๊ฐ€ ์ฝ”๋“œ
        public E remove(int index) {
            Node<E> removeNode = getNode(index);
            E removedItem = removeNode.item;
            //์ฒซ๋ฒˆ ์งธ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š”๊ฒŒ ๋‚ด๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋˜๊ฑธ๋กœ ๋ณ€๊ฒฝ
            if(index == 0) {    
                first = removeNode.next;
            //๋‚ด ์ง์ „ ๋…ธ๋“œ๊ฐ€ ๋‚ด๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋˜๊ฑธ๋กœ ๋ณ€๊ฒฝ    
            } else {
                Node<E> prev = getNode(index - 1);
                prev.next = removeNode.next;
            }
            //๋‚ด ์•„์ดํ…œ null๋กœ, ๋‚ด๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋˜ ์ฃผ์†Œ๋„ null๋กœ
            removeNode.item = null;
            removeNode.next = null;
            size--;
            return removedItem;
        }
    
        public E get(int index) {
            Node<E> node = getNode(index);
            return node.item;
        }
    
        private Node<E> getNode(int index) {
            Node<E> x = first;
            for (int i = 0; i < index; i++) {
                x = x.next;
            }
            return x;
        }
    
        public int indexOf(E e) {
            int index = 0;
            for (Node<E> x = first; x != null; x = x.next) {
                if(e.equals(x.item)) {
                    return index;
                }
                index++;
            }
            return -1;
        }
    
        public int size() {
            return size;
        }
    
        @Override
        public String toString() {
            return "MyLinkedListV1{" +
                    "first=" + first +
                    ", size=" + size +
                    '}';
        }
    
        //์ค‘์ฒฉ ํด๋ž˜์Šค
        private static class Node<E> {
    
            E item;
            Node<E> next;
    
            public Node(E item) {
                this.item = item;
            }
            //[A -> B -> C]
            @Override
            public String toString() {
                StringBuilder sb = new StringBuilder();
                Node<E> x = this;
                sb.append("[");
                while (x != null) {
                    sb.append(x.item);
                    if(x.next != null) sb.append("->");
                    x = x.next;
                }
                sb.append("]");
                return sb.toString();
            }
        }
    }

    reference: https://www.inflearn.com/course/%EA%B9%80%EC%98%81%ED%95%9C%EC%9D%98-%EC%8B%A4%EC%A0%84-%EC%9E%90%EB%B0%94-%EC%A4%91%EA%B8%89-2/dashboard?inst=e57a2bad 

     

    ๊น€์˜ํ•œ์˜ ์‹ค์ „ ์ž๋ฐ” - ์ค‘๊ธ‰ 2ํŽธ ๊ฐ•์˜ | ๊น€์˜ํ•œ - ์ธํ”„๋Ÿฐ

    ๊น€์˜ํ•œ | ์ž๋ฐ” ์ œ๋„ค๋ฆญ๊ณผ ์ปฌ๋ ‰์…˜ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‹ค๋ฌด ์ค‘์‹ฌ์œผ๋กœ ๊นŠ์ด์žˆ๊ฒŒ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค. ์ž๋ฃŒ ๊ตฌ์กฐ์— ๋Œ€ํ•œ ๊ธฐ๋ณธ๊ธฐ๋„ ํ•จ๊ป˜ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค., ๊ตญ๋‚ด ๊ฐœ๋ฐœ ๋ถ„์•ผ ๋ˆ„์  ์ˆ˜๊ฐ•์ƒ 1์œ„, ์ œ๋Œ€๋กœ ๋งŒ๋“  ๊น€์˜ํ•œ์˜ ์‹ค์ „

    www.inflearn.com


    ๊ฐœ์ธ ์Šคํ„ฐ๋”” ๊ธฐ๋ก์„ ๋ฉ”๋ชจํ•˜๋Š” ๊ณต๊ฐ„์ด๋ผ ํ‹€๋ฆฐ์ ์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    ํ‹€๋ฆฐ ์  ์žˆ์„ ๊ฒฝ์šฐ ๋Œ“๊ธ€ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

    ๋Œ“๊ธ€