๐Ÿ Linked list

๋˜˜์ด์ฃผ์ธยท2021๋…„ 7์›” 13์ผ
0

Linked list (์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ)๋ž€?

์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ, ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ(linked list)๋Š” ๊ฐ ๋…ธ๋“œ๊ฐ€ ๋ฐ์ดํ„ฐ์™€ ํฌ์ธํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ํ•œ ์ค„๋กœ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ์ž๋ฃŒ ๊ตฌ์กฐ์ด๋‹ค. ์ด๋ฆ„์—์„œ ๋งํ•˜๋“ฏ์ด ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด๊ณ  ์žˆ๋Š” ๋…ธ๋“œ๋“ค์ด ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š”๋ฐ, ๋…ธ๋“œ์˜ ํฌ์ธํ„ฐ๊ฐ€ ๋‹ค์Œ์ด๋‚˜ ์ด์ „์˜ ๋…ธ๋“œ์™€์˜ ์—ฐ๊ฒฐ์„ ๋‹ด๋‹นํ•˜๊ฒŒ ๋œ๋‹ค.

  • ๊ณ ๊ตฌ๋งˆ ์ค„๊ธฐ

    โ†’ ๊ณ ๊ตฌ๋งˆ ์ค„๊ธฐ๋ผ๊ณ  ์ƒ๊ฐํ•ด๋ณด๊ธฐ. ์ฒ˜์Œ ์‹œ์ž‘ ๋ถ€๋ถ„๋งŒ ์•Œ๊ณ ์žˆ๋‹ค, ๊ทธ ์‹œ์ž‘ ๋ถ€๋ถ„์„ ํƒ€๊ณ  ๋“ค์–ด๊ฐ€๋‹ค ๋ณด๋ฉด ๊ณ ๊ตฌ๋งˆ(data)๊ฐ€ ๊ณ„์† ์ค„์ค„์ด ๋‚˜์˜จ๋‹ค. ์‹œ์ž‘(์ฃผ์†Œ) - ์—ฐ๊ฒฐ(link) - ๋(null pointer or circular)

    ์œ„์˜ ์ˆœ์„œ๊ฐ€ ์กด์žฌํ•จ์„ ๊ธฐ์–ตํ•˜๊ธฐ.

๊ตฌ์กฐ

๋…ธ๋“œ(Node)์™€ ๋งํฌ(Link)๋กœ ๊ตฌ์„ฑ๋˜๋ฉฐ, ๋…ธ๋“œ๋Š” ์‹ค์ œ ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ๋Š” ํ•˜๋‚˜์˜ ๋‹จ์œ„์ด๊ณ , ๋งํฌ๋Š” ๋…ธ๋“œ๊ฐ„์˜ ์œ„์น˜์ •๋ณด๋ฅผ ์ €์žฅํ•˜๊ณ  ์žˆ์–ด ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ์˜ ์ˆœ์„œ๋ฅผ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ์—ฐ๊ฒฐ๊ณ ๋ฆฌ๋ผ ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋…ธ๋“œ์˜ ์‹œ์ž‘์ ์€ head, ๋์ ์€ tail์ด๋ผ ๋ถ€๋ฅด๋ฉฐ ๋…ธ๋“œ์˜ ์ถ”๊ฐ€, ์‚ญ์ œ, ํƒ์ƒ‰์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

๋ฐฐ์—ด ๋ฆฌ์ŠคํŠธ์™€ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์˜ ์žฅ๋‹จ์ 

  1. ๋ฐฐ์—ด๋ฆฌ์ŠคํŠธ

    • ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ๋ฉ”๋ชจ๋ฆฌ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ

    ์žฅ์ 

    • ๋™์ผํ•œ ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ ์—ฐ์†์ ์œผ๋กœ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ๊ฐ„๋‹จํ•˜๊ณ , ์‚ฌ์šฉ์ด ์‰ฌ์šฐ๋ฉฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐธ์กฐํ•˜๊ธฐ ์‰ฝ๋‹ค.

    ๋‹จ์ 

    • ๊ณ ์ •๋œ ํฌ๊ธฐ(JS ์ œ์™ธ)๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์„œ ๋ฐฐ์—ด์˜ ์ฒ˜์Œ์ด๋‚˜ ์ค‘๊ฐ„์—์„œ ์›์†Œ๋ฅผ ๋„ฃ๊ณ  ๋นผ๋ ค๋ฉด ๋น„์‹ผ ์—ฐ์‚ฐ์„ ๋นˆ๋ฒˆํ•˜๊ฒŒ ํ•ด์•ผ ํ•œ๋‹ค.
  2. ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ

    • ์ผ๋ จ์˜ ์›์†Œ๋ฅผ ๋ฐฐ์—ด์ฒ˜๋Ÿผ ์ฐจ๋ก€๋Œ€๋กœ ์ €์žฅํ•˜์ง€๋งŒ ์›์†Œ๋“ค์ด ๋ฉ”๋ชจ๋ฆฌ์ƒ์— ์—ฐ์†์ ์œผ๋กœ ์œ„์น˜ํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋…ธ๋“œ๋กœ ๊ตฌํ˜„๋œ ๋ฆฌ์ŠคํŠธ์ด๋‹ค. ๋งํฌ ํ•˜๋‚˜์— 4 byte ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ฐจ์ง€ํ•˜๋ฉฐ, ๋”๋ธ” ๋งํฌ๋“œ์ผ ๊ฒฝ์šฐ์—” ๋…ธ๋“œ ํ•˜๋‚˜์— 8 byte์˜ ๋งํฌ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ฐจ์ง€ํ•œ๋‹ค.

ํƒ์ƒ‰๊ณผ ์ •๋ ฌ์„ ์ž์ฃผ ํ•œ๋‹ค๋ฉด ๋ฐฐ์—ด ๋ฆฌ์ŠคํŠธ
์ถ”๊ฐ€์™€ ์‚ญ์ œ๊ฐ€ ๋งŽ๋‹ค๋ฉด ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ

Linked list (์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ) ํŠน์ง•

  1. ์—ฐ์†๋˜๋Š” ํ•ญ๋ชฉ๋“ค์ด ํฌ์ธํŠธ๋กœ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋‹ค.

  2. ๋งˆ์ง€๋ง‰ ํ•ญ๋ชฉ์€ Null์„ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ์Œ. (๋งˆ์ง€๋ง‰์ด๋ผ ์—ฐ๊ฒฐํ•œ ๋…ธ๋“œ๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ)

  3. ํ”„๋กœ๊ทธ๋žจ์ด ์ˆ˜ํ–‰๋˜๋Š” ๋™์•ˆ ํฌ๊ธฐ๊ฐ€ ๋™์ ์œผ๋กœ ์ปค์ง€๊ฑฐ๋‚˜ ์ž‘์•„์ง.

  4. ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„ ๋‚ญ๋น„๊ฐ€ ์ ์ง€๋งŒ ํฌ์ธํ„ฐ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ•„์š”ํ•จ.

  5. ๋ฐฐ์—ด์— ๋น„ํ•ด ๋ฐ์ดํ„ฐ์˜ ์ถ”๊ฐ€์™€ ์‚ฝ์ž…์— ์šฉ์ด.

  6. ๋‹จ๋ฐฉํ–ฅ(์–‘๋ฐฉํ–ฅ์ด๋ผ๋„) ์ˆœ์ฐจ์ ์œผ๋กœ ํƒ์ƒ‰ํ•˜์ง€ ์•Š์œผ๋ฉด ์š”์†Œ์— ์ ‘๊ทผ์ด ๋ถˆ๊ฐ€ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํƒ์ƒ‰ ์†๋„๊ฐ€ ๋–จ์–ด์ง.

  7. ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฑด ๊ฐ์ฒด ํ• ๋‹น์ž„.

  8. ๋งํฌ๋ฅผ ๋Š์–ด ๋ฒ„๋ฆฌ๋ฉด ๋ฐ์ดํ„ฐ๊ฐ€ ์‚ญ์ œ๋˜๊ธฐ ๋•Œ๋ฌธ์— (JS๊ธฐ์ค€) ๋งŒ์•ฝ head์—์„œ ๋…ธ๋“œ๋ฅผ ์ „์ฒด ์‚ญ์ œํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด head์— ์žˆ๋Š” ๋งํฌ๋ฅผ ๋Š์–ด ๋ฒ„๋ฆฌ๊ธฐ๋งŒ ํ•˜๋ฉด ๋œ๋‹ค.

์œ„์˜ ์ด๋ฏธ์ง€๋ฅผ ์ฝ”๋“œ๋กœ ๋ณธ๋‹ค๋ฉด.

head: {0: 'apple', next: {1: 'banana', next: {2: 'dream', next: null}}}}
tail: {2: 'dream', next: null}

๋งŒ์•ฝ ์‚ญ์ œํ•˜๊ณ ์‹ถ๋‹ค๋ฉด?

data2๋ฅผ ์‚ญ์ œํ•ด ์ฃผ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, data1์˜ ๋งํฌ๋ฅผ 2๊ฐ€ ์•„๋‹Œ 3์œผ๋กœ ๋‹ค์‹œ ์—ฐ๊ฒฐ์„ ํ•ด์ฃผ๋ฉด data2๋Š” head์—์„œ ์ž๋™์œผ๋กœ ๋น ์ง€๊ฒŒ๋˜์–ด ์—†์–ด์ง„๋‹ค. ์ถ”๊ฐ€๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ด๋‹ค. 1๊ณผ 3 ์‚ฌ์ด์— ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ๊ฒŒ ๋œ๋‹ค๋ฉด 1์˜ ๋งํฌ๋ฅผ 3์ด์•„๋‹Œ ๋„ฃ์œผ๋ ค๋Š” ๋ฐ์ดํ„ฐ์— ์—ฐ๊ฒฐํ•˜๊ณ , ๋„ฃ์œผ๋ ค๋Š” ๋ฐ์ดํ„ฐ๋ฅผ 3์œผ๋กœ ์—ฐ๊ฒฐํ•ด์ฃผ๋ฉด๋œ๋‹ค.

์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์˜ ์ข…๋ฅ˜

  1. Singly linked list (์ผ๋ฐฉํ–ฅ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ)
    ์ง€๊ธˆ๊นŒ์ง€ ์œ„์˜ ์„ค๋ช…๋“ค์ด ๋ฐ”๋กœ ์ผ๋ฐฉํ–ฅ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์ด๋‹ค. ์ผ๋ฐฉํ–ฅ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋Š” ๋…ธ๋“œ์— ํฌ์ธํ„ฐ(๋‹ค์Œ ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋งํฌ)๊ฐ€ ํ•œ ๊ฐœ์ธ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์ธ๋ฐ, ์ด ๋ฆฌ์ŠคํŠธ์˜ ์žฅ์ ์€ ๋…ธ๋“œ๋‹น ํฌ์ธํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ 4๋ฐ”์ดํŠธ๋งŒ ์ฐจ์ง€ํ•ด์„œ ์ด์ค‘ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋ณด๋‹ค ๋ฐ์ดํ„ฐ๋ฅผ ์•„๋‚„ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ด๋‹ค. ๋‹ค๋งŒ ์ผ๋ฐฉํ–ฅ์ด๊ธฐ ๋•Œ๋ฌธ์— ํ˜„์žฌ ๋…ธ๋“œ๋Š” ์ด์ „ ๋…ธ๋“œ๋กœ ๋Œ์•„๊ฐ€๋Š” ๋ฒ•์„ ๋ชจ๋ฅธ๋‹ค. ์˜ค์ง ์ง์ง„๋งŒ์ด ์žˆ์„ ๋ฟ.

  2. Doubly linked list (์ด์ค‘ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ)

    ๋…ธ๋“œ์— ํฌ์ธํ„ฐ๊ฐ€ ๋‘ ๊ฐœ ์žˆ๋Š” ์ด์ค‘ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์ธ๋ฐ, ์ผ๋ฐฉํ–ฅ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์™€ ๋˜‘๊ฐ™์ง€๋งŒ ์•ž์„œ ๋งํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ๋…ธ๋“œ์— ํฌ์ธํ„ฐ๊ฐ€ ๋‘ ๊ฐœ ์žˆ๋‹ค๋Š” ์ ์ด ๋‹ค๋ฅด๋‹ค ์ด ๋‘ ๊ฐœ์˜ ํฌ์ธํ„ฐ๋Š” ์ „๊ณผ ํ›„๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ผ๋ฐฉํ–ฅ๊ณผ๋Š” ๋‹ฌ๋ฆฌ ์ด์ „์œผ๋กœ ๊ฐˆ ์ˆ˜๋„, ์ดํ›„๋กœ๋„ ๊ฐˆ ์ˆ˜๋„ ์žˆ๋‹ค. ํฌ์ธํ„ฐ๊ฐ€ ๋‘ ๊ฐœ๊ฐ€ ์ƒ๊ฒผ์œผ๋‹ˆ ๋ฐ์ดํ„ฐ๋„ ๋‘ ๋ฐฐ๋กœ ๋จน๋Š”๋‹ค. 8๋ฐ”์ดํŠธ๋ฅผ ์ฐจ์ง€ํ•ฉ๋‹ˆ๋‹ค.

  3. Circular linked list (ํ™˜ํ˜• ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ)

    ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์— ์žˆ๋Š” ํ—ค๋“œ์™€ ํ…Œ์ผ์ด ๋ถ™์—ฌ์ ธ ์žˆ์–ด, ์›์˜ ๋ชจ์–‘๊ณผ ๊ฐ™๋‹ค๊ณ  ํ•˜์—ฌ ํ™˜ํ˜• ๋ฆฌ์ŠคํŠธ์ด๋‹ค. ํ…Œ์ผ์˜ ํฌ์ธํ„ฐ๊ฐ€ null์„ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋Š” ๊ฒƒ์ด ์•„๋‹Œ head๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋Š” ๊ฒƒ์ธ๋ฐ, ๋…ธ๋“œ 6 ๋ฒˆ์— ์žˆ๋‹ค๊ฐ€ 4 ๋ฒˆ์œผ๋กœ ๊ฐ€์•ผ ๋œ๋‹ค๋ฉด, ์ผ๋ฐฉํ–ฅ ๋ฆฌ์ŠคํŠธ๋Š” ๋‹ค์‹œ ์‹œ์ž‘ํ•ด์•ผ ๋˜์ง€๋งŒ ํ™˜ํ˜• ๋ฆฌ์ŠคํŠธ๋Š” 7, 8, 9, 10์„ ์ง€๋‚˜ ๋‹ค์‹œ 0, 1, 2, 3, 4๋กœ ๊ฐˆ ์ˆ˜ ์žˆ๋‹ค ์ฆ‰ ์ˆœํšŒํ•  ๋•Œ ์ข‹์€ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์ด๋‹ค.

LinkedList - Java ๊ตฌํ˜„ - Data Structure (์ž๋ฃŒ๊ตฌ์กฐ)

//์ฝ”๋“œ๋Š” egoing๋‹˜ ๊ฐ•์˜ ์ฐธ์ดˆํ•˜๋ฉฐ ์‹ค์Šตํ–ˆ์Šต๋‹ˆ๋‹ค.
package com.hajni.lib;

import java.nio.channels.FileLockInterruptionException;
import java.util.ListIterator;

public class LinkedList {
    private Node head;  //  ๋ˆ„๊ฐ€ ์ฒซ๋ฒˆ์งธ์ธ๊ฐ€.
    private Node tail;  //  ์ œ์ผ ๋์— ์žˆ๋Š”๊ฐ€.
    private int size = 0;

    private class Node {
        private Object data;    // ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋  ํ•„๋“œ
        private Node nexe;      // ๋‹ค์Œ ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ํ•„๋“œ.

        public Node(Object input) {  // Node๊ฐ€ ์ƒ์„ฑ๋˜์–ด์žˆ์„๋•Œ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฐ’์ด input์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌ
            this.data = input;
            this.nexe = null;
        }

        public String toString() {   // ๋…ธ๋“œ์˜ ๋‚ด์šฉ์„ ์ถœ๋ ฅํ•ด์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ
            return String.valueOf(this.data);
        }
    }

    // ์ฒ˜์Œ์— ์ถ”๊ฐ€
    public void addFirst(Object input) {
        Node newNode = new Node(input);
        newNode.nexe = head;    // ์ƒˆ๋กœ์šด ๋…ธ๋“œ์˜ ๋‹ค์Œ ๋…ธ๋“œ๋ฅผ head์ง€์ •
        head = newNode;         // head๋กœ ์ƒˆ๋กœ์šด ๋…ธ๋“œ๋ฅผ ์ง€์ •
        size++;

        if (head.nexe == null) {
            tail = head;
        }
    }

    // ๋์— ์ถ”๊ฐ€
    public void addLast(Object input) {
        Node newNode = new Node(input);
        if (size == 0) {
            addFirst(input);
        } else {
            /**
             * ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ(tail)์˜ ๋‹ค์Œ ๋…ธ๋“œ(next)๊ฐ€ ์ƒˆ ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋„๋ก ํ•˜๊ณ 
             * tail์ด ๊ฐ€๋ฆฌํ‚ค๋Š” ๋…ธ๋“œ๋ฅผ ์ƒˆ ๋…ธ๋“œ๋กœ ๋ฐ”๊ฟ”์ค€๋‹ค.
             */
            tail.nexe = newNode;
            tail = newNode;
            size++;
        }

    }

    // ๋…ธ๋“œ ์ถ”๊ฐ€ํ•˜๊ธฐ ์ „ ํŠน์ • ์œ„์น˜ ๋…ธ๋“œ ์ฐพ์•„๋ƒ„
    Node node(int index) {
        Node x = head;
//        x = x.nexe;  -> ๋งŒ์•ฝ index100๋ฒˆ์งธ๋ฅผ ๊ฐ€์ ธ์˜ค๋ ค๋ฉด x 100 ์„ํ•ด์•ผํ•œ๋‹ค = ๋ฐ˜๋ณต๋ฌธ์‚ฌ์šฉํ•ด์•ผํ•จ.
        for (int i = 0; i < index; i++) {
            x = x.nexe;
        }
        return x;
    }

    // ํŠน์ •์œ„์น˜ ๋…ธ๋“œ ์ถ”๊ฐ€ ๋ฉ”์†Œ๋“œ
    public void add(int k, Object input) {
        if (k == 0) {
            addFirst(input);
        } else {
            Node temp1 = node(k - 1);
            Node temp2 = temp1.nexe;
            Node newNode = new Node(input);

            /**
             * ์ด์ „ ๋…ธ๋“œ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋…ธ๋“œ๋ฅผ ๋Š์€ ๋’ค
             * ์ƒˆ ๋…ธ๋“œ๋กœ ๋ณ€๊ฒฝํ•ด์ค€๋‹ค.
             * ๋˜ํ•œ ์ƒˆ ๋…ธ๋“œ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋…ธ๋“œ๋Š” temp2๋กœ
             * ์„ค์ •ํ•ด์ค€๋‹ค.
             */
            temp1.nexe = newNode;
            newNode.nexe = temp2;
            size++;
            if (newNode.nexe == null){
                tail = newNode;
            }
        }
    }

    // ๋ฆฌ์ŠคํŠธ ํ™•์ธ ์ฝ”๋“œ
    public String toString(){
        if (head == null){
            return "[]";
        }

        Node temp = head;
        String str = "[";

        while(temp.nexe != null){
            str += temp.data + " , ";
            temp = temp.nexe;
        }
        str += temp.data;
        return str + "]";

    }

    // ์ฒซ๋ฒˆ์งธ ๋…ธ๋“œ ์‚ญ์ œ
    public Object removeFirst(){
        Node temp = head;
        head = head.nexe;
        Object returnData = temp.data;  // ๋ฐ์ดํ„ฐ ์‚ญ์ œ ์ „ ๋ฆฌํ„ดํ•  ๊ฐ’์„ ์ž„์‹œ ๋ณ€์ˆ˜์— ๋‹ด๋Š”๋‹ค.
        temp = null;
        size--;
        return returnData;
    }

    // ์ค‘๊ฐ„ ๋…ธ๋“œ ์‚ญ์ œ
    public Object remove(int k){
        if (k == 0){
            return removeFirst();
        }
        Node temp = node(k - 1);  // ์‚ญ์ œํ•  ๋…ธ๋“œ์˜ ์ด์ „ ๋…ธ๋“œ
        Node todoDeleted = temp.nexe;   // ์‚ญ์ œํ•  ๋…ธ๋“œ
        temp.nexe = temp.nexe.nexe;     // ์‚ญ์ œํ•  ๋…ธ๋“œ์˜ ๋‹ค์Œ ๋…ธ๋“œ
        Object returnData = todoDeleted.data;   // ์‚ญ์ œ๋˜๋Š” ๋…ธ๋“œ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ์œ„ํ•œ ์ž„์‹œ๋ณ€์ˆ˜

        if (todoDeleted == tail){
            tail = temp;
        }
        todoDeleted = null;
        size--;

        return returnData;
    }

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

    public int size(){
        return size;
    }

    public Object get(int k){
        Node temp = node(k);
        return temp.data;
    }

    public Object indexOf(Object data){
        Node temp = head;
        int index = 0;
        while (temp.data != data){
            temp = temp.nexe;
            index++;

            if (temp == null){
                return -1; // ์ฐพ๊ณ ์ž ํ•˜๋Š” ์š”์†Œ๋ฅผ ์ฐพ์ง€ ๋ชปํ–ˆ์„ ๊ฒฝ์šฐ -1 ๋ฐ˜ํ™˜
            }
        }
        return index;
    }

    public ListIterator listIterator() {
        return new ListIterator();
    }
    class ListIterator{
        private Node lastReturned;
        private Node next;
        private int nextIndex;

        ListIterator(){
            next = head;
            nextIndex = 0;
        }

        public Object next(){
            lastReturned = next;
            next = next.nexe;
            nextIndex++;

            return lastReturned.data;
        }

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

        public void add(Object input){
            Node newNode = new Node(input);

            if (lastReturned == null){
                // ์ฒ˜์Œ์œ„์น˜์— ๋…ธ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ใ…‹๋“œ
                head = newNode;
                newNode.nexe = next;
            }else {
                // ์ค‘๊ฐ„์— ์ถ”๊ฐ€ํ•˜๋Š” ์ฝ”๋“œ
                lastReturned.nexe = newNode;
                newNode.nexe = next;
            }

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

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

}

0๊ฐœ์˜ ๋Œ“๊ธ€