PS/Data Structure

LinkedList ๊ตฌํ˜„ ๋ฐฉ๋ฒ• (MyLinkedList)

chaerlo127 2022. 4. 10. 14:59
728x90

โœจ  Constructor & Basic Attribute

private Node head;
private Node tail;
private int size;

private class Node{
    private int value;
    private Node next;

    private Node(int data) {
        this.value = data;
        this.next = null;
    }

    public String toString() {
        return String.valueOf(this.value);
    }
}

์ œ์ผ ์•ž์— ์žˆ๋Š” ๋…ธ๋“œ, ๋’ค์— ์žˆ๋Š” ๋…ธ๋“œ, size๋ฅผ ์ •์˜ํ•œ๋‹ค. ๋˜ํ•œ ๋…ธ๋“œ๋ฅผ ๋‚ด๋ถ€ class๋กœ ์ƒ์„ฑํ•˜์—ฌ contructor๋กœ ๊ฐ์ฒด ์ƒ์„ฑ ์‹œ ์ดˆ๊ธฐํ™”ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.

 

 

โœจ addFirst(int data)

public void addFirst(int data) {
    Node newNode = new Node(data);
    // ๊ธฐ์กด์˜ head๋ฅผ ๋‹ค์Œ node๋กœ ์ง€์ •
    newNode.next = head;
    head = newNode;
    size++;
    if(head.next == null) {
        tail = head;
    }
}

 ์ฝ”๋“œ๋ฅผ ๊ณต๋ถ€ํ•˜๋Š”๋ฐ ์™„๋ฒฝํ•˜๊ฒŒ ์ดํ•ด๊ฐ€ ๊ฐ€์ง€ ์•Š์•„์„œ ๊ทธ๋ฆผ์„ ๊ทธ๋ ค ์ดํ•ด๋ฅผ ํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ–ˆ๋‹ค.

addFirst๋ฅผ ํ•˜๊ธฐ ์ „์—๋Š” ์ฒซ ๋ฒˆ์งธ ํŒŒ๋ž€์ƒ‰ ๋™๊ทธ๋ผ๋ฏธ๊ฐ€ Head ์˜€๋‹ค. newNode๊ฐ€ head๊ฐ€ ๋˜๊ธฐ ์ด์ „์—, newNode์˜ next์— head์˜ ์ •๋ณด๋ฅผ ๋‘๊ณ  newNode๋ฅผ head๋กœ ์ง€์ •ํ•œ๋‹ค. ์ด๋•Œ, head = newNode๋ฅผ ์ง„ํ–‰ํ•˜๊ณ , newNode.next = head๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด next์˜ ๊ฐ’์ด ๋ฌด์—‡์ธ์ง€ ์•Œ ์ˆ˜ ์—†๋‹ค.

 

โœจ addLast(int data)

public void addLast(int data) {
    Node newNode = new Node(data);
    // ์ฒ˜์Œ์œผ๋กœ ๊ฐ’์„ ๋„ฃ๋Š”๋‹ค๋ฉด
    if(size == 0) {
        addFirst(data);
    }else {
        tail.next = newNode;
        tail = newNode;
        size++;
    }
}

 

๋งŒ์•ฝ ์ฒซ ๋ฒˆ์งธ๋กœ Node์˜ ๊ฐ’์„ ๋„ฃ๋Š” ๊ฒƒ์ด๋ผ๋ฉด addFirst ํ•จ์ˆ˜๋กœ ๊ฐ’์„ ๋„ฃ๊ณ , ๋…ธ๋“œ์˜ ๊ฐ’์ด ์‹ค์ œ๋กœ ์žˆ๋Š” ์ฑ„๋กœ ๊ฐ’์„ ๋„ฃ๋Š”๋‹ค๋ฉด ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ์˜ next๋ฅผ newNode๋กœ ํ•œ๋‹ค. ๊ทธ ํ›„, tail node๋ฅผ newNode๋กœ ์„ ์–ธํ•˜๋ฉด ๋œ๋‹ค.

 

 

โœจ add(int index, int data)

public void add(int index, int data) {
    if(index ==0) {
        addFirst(data);
    }else {
        Node x = node(index-1); // index 2์— ๋„ฃ๊ณ  ์‹ถ๋‹ค๋ฉด index 1์˜ node
        if(x == null) {
            return;
        }
        Node y = x.next; // ์›๋ž˜ index 2 node

        Node newNode = new Node(data);
        x.next = newNode;
        newNode.next = y;
        size ++;

        if(newNode.next == null) {
            tail = newNode;
        }
    }
}

// ์™ธ๋ถ€์—์„œ ์‚ฌ์šฉํ•˜๋ฉด ์•ˆ๋จ.
private Node node(int index) {
    Node x = head;
    for(int i = 0; i<index ;i++	) {
        x = x.next;
        if(x == null) {
            return null;
        }
    }
    return x;
}

์›ํ•˜๋Š” index๋กœ data๋ฅผ add ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” index์— ์œ„์น˜ํ•œ node๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์•Œ์•„์•ผ ํ•œ๋‹ค. ์ด ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ํ•จ์ˆ˜๊ฐ€ node(int index)์ด๋‹ค. ์ด ํ•จ์ˆ˜๋Š” ์™ธ๋ถ€์—์„œ ์‚ฌ์šฉํ•˜๋ฉด ์•ˆ๋˜๊ธฐ ๋•Œ๋ฌธ์— public์„ ๋ถ™์—ฌ์ฃผ์ง€ ์•Š๋Š”๋‹ค.

node(int index)๋Š” node๋ฅผ head๋ถ€ํ„ฐ ์ฐจ๋ก€๋Œ€๋กœ index์˜ ๊ฐ’๊นŒ์ง€ ๊ฐ’์„ ๋ถˆ๋Ÿฌ์˜ค๊ณ  node๋ฅผ return ํ•ด์ค€๋‹ค. 

 

add(int index, int data)์—์„œ index๊ฐ€ 0์ด๋ฉด addFirst๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , ์•„๋‹ˆ๋ฉด ์œ„์˜ ์ฝ”๋“œ๋Œ€๋กœ ์ง„ํ–‰ํ•œ๋‹ค.

 

 

โœจ toString()

public String toString() {
    String str = "";
    Node temp = head;

    while(temp.next!=null) {
        str += temp.value + ", ";
        temp = temp.next;
    }
    str += temp.value;
    return str;
}

 

โœจ remove

1. removeFirst()

2. remove(int index)

3. removeLast()

public int removeFirst() {
    if(head == null) {
        return -1;
    }

    Node temp = head;
    head = head.next;
    int returnData = temp.value;
    temp = null;
    size --;

    return returnData;
}


public int remove(int index) {
    if(index == 0) {
        return removeFirst();
    }else if(node(index-1) == null) {
        return -1;
    }
    else{
        Node x = node(index-1);
        Node y = x.next; // ์‚ญ์ œํ•  ๋…ธ๋“œ

        x.next = y.next;
        int returnData = y.value;

        if(y == tail) {
            tail = x;
        }
        y = null;
        size--;
        return returnData;
    }

}

public int removeLast() {
    return remove(size-1);
}

 

 

โœจ size() & get()

public int size() {
    return size;
}

public int get(int index) {
    return node(index).value;
}

 

โœจ indexOf

public int indexOf(int data) {
    Node temp = head;
    int index = 0;
    while(head.value != data) {
        temp = temp.next;
        index ++;
        if(temp == null) { // data์˜ ๊ฐ’์ด ์—†๋‹ค๋ฉด
            return -1;
        }
    }
    return index;
}

 

 

โœจ ListIterator next, hasNext

//main.class
MyLinkedList.MyListIterator listIterator = numbers.listIterator();

//MyLinkedList.MyListIterator.class
public class MyListIterator{
    private Node next;
    private Node lastReturned;
    private int nextIndex;

    public MyListIterator() {
        this.next = MyLinkedList.this.head;
        this.nextIndex = 0;
    }

    public int next() {
        this.lastReturned = this.next;
        this.next = this.next.next;
        this.nextIndex ++;
        return lastReturned.value;
    }

    public boolean hasNext() {
        return nextIndex < size();
    }

}

 

previous ๋…ธ๋“œ๋Š” ๊ฐ’์„ ์•Œ ์ˆ˜ ์—†๋Š”๋ฐ, ๊ทธ ์ด์œ ๋Š” ๋…ธ๋“œ๋Š” ํ•œ ๋ฐฉํ–ฅ์œผ๋กœ ์ด๋™ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์–‘๋ฐฉํ–ฅ์œผ๋กœ ์•Œ๊ธฐ ์œ„ํ•ด์„œ๋Š” double linkedList๋ฅผ ๊ณต๋ถ€ํ•ด์•ผ ํ•œ๋‹ค.

 

โœจ ListIterator add

public void add(int data) {
    Node newNode = new Node(data);
    if(lastReturned == null) {
        head = newNode;
        newNode.next = this.next;
    } else {
        lastReturned.next = newNode;
        newNode.next = this.next;
    }	

    lastReturned = newNode;
    nextIndex++;
    size ++;

}

 

 

โœจ ListIterator remove

public void remove() {
    if(nextIndex == 0) {
        throw new IllegalStateException();
    }
    MyLinkedList.this.remove(nextIndex-1);
    nextIndex--;
}

๊ธฐ์กด remove ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์„œ, node ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๋ฏ€๋กœ ์‹ค์šฉ์ ์ธ ์ฝ”๋“œ๋Š” ์•„๋‹ˆ๋‹ค.

 

 

728x90