Computer Science (CS)/์ž๋ฃŒ๊ตฌ์กฐ

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

yjdat 2022. 10. 11. 08:05

๐Ÿ“‹ ๋ชฉ์ฐจ

โ“ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ ๋ž€?

Array(๋ฐฐ์—ด) & List (๋ฆฌ์ŠคํŠธ)

ํŠน์ง•

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

์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ ๊ตฌํ˜„ (์ž๋ฐ”)


 

โ“ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ ๋ž€? 

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

์ž๋ฃŒ์˜ ๋…ผ๋ฆฌ์ ์ธ ์ˆœ์„œ์™€ ๋ฉ”๋ชจ๋ฆฌ ์ƒ์˜ ๋ฌผ๋ฆฌ์ ์ธ ์ˆœ์„œ๊ฐ€ ์ผ์น˜ํ•˜์ง€ ์•Š๊ณ , ๊ฐœ๋ณ„์ ์œผ๋กœ ์œ„์น˜ํ•˜๊ณ  ์žˆ๋Š” ์›์†Œ์˜ ์ฃผ์†Œ๋ฅผ ์—ฐ๊ฒฐํ•˜์—ฌ ํ•˜๋‚˜์˜ ์ „์ฒด์ ์ธ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์ด๋ฃน๋‹ˆ๋‹ค.

 

๐Ÿ”ถ Array(๋ฐฐ์—ด) & List (๋ฆฌ์ŠคํŠธ)

์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์•ž์„œ ๋ฐฐ์—ด๊ณผ ๋ฆฌ์ŠคํŠธ์˜ ์ปดํ“จํ„ฐ ๊ณตํ•™์ ์ธ ๊ฐœ๋…๋ถ€ํ„ฐ ์ž ๊น ์งš๊ณ  ๋„˜์–ด๊ฐ€๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค.

๋ฐฐ์—ด์€ ๋ฉ”๋ชจ๋ฆฌ ์ƒ์— ์—ฐ์†์ ์ธ ๊ณต๊ฐ„์„ ํ• ๋‹น๋ฐ›์•„ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ๋ฐฐ์—ด์€ ์›์†Œ์— ์ ‘๊ทผํ•  ๋•Œ ‘์ธ๋ฑ์Šค(Index)’ ๋ผ๋Š” ๊ฐœ๋…์„ ์‚ฌ์šฉํ•˜๋Š”๋ฐ ์›์†Œ์˜ ๋ฐ์ดํ„ฐ ์ฃผ์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ์‹๋ณ„์ž์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ํŠน์ • ์›์†Œ์— ๋น ๋ฅด๊ฒŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ์žฅ์ ์ด ์žˆ์ง€๋งŒ, ๋ฐ˜๋Œ€๋กœ ์ค‘๊ฐ„์— ์žˆ๋Š” ์›์†Œ ์‚ฝ์ž…/์‚ญ์ œ๊ฐ€ ๋Š๋ฆฝ๋‹ˆ๋‹ค.

๋ฆฌ์ŠคํŠธ๋Š” ๊ฐ ์›์†Œ๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ ์ƒ ์—ฐ์†์ ์ธ ๊ณต๊ฐ„์— ํ• ๋‹น๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ์ฒซ๋ฒˆ์งธ ์›์†Œ์˜ ์ฃผ์†Œ๋ฅผ ์•Œ๋”๋ผ๋„ ๊ทธ ๋‹ค์Œ ์›์†Œ์˜ ์ฃผ์†Œ๋ฅผ ๋‹จ์ˆœํžˆ ๊ณ„์‚ฐํ•  ์ˆ˜ ์—†๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค. ๋ฆฌ์ŠคํŠธ์˜ ๊ฐ ์›์†Œ๋Š” ๋‹ค์Œ ์›์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ‘ํฌ์ธํ„ฐ(Pointer)’ ๋“ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ ์›์†Œ์˜ ์ˆœ์„œ๋ฅผ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฐ ํŠน์ง•์œผ๋กœ ๋ฐฐ์—ด๋ณด๋‹ค ๋ฐ์ดํ„ฐ์˜ ์‚ฝ์ž…/์‚ญ์ œ๊ฐ€ ๋น ๋ฅธ ํŽธ์ž…๋‹ˆ๋‹ค. ์•ž, ๋’ค์˜ ์›์†Œ์˜ ํฌ์ธํ„ฐ๋งŒ ๋ฐ”๊ฟ”์ฃผ๋ฉด ๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ, ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŠน์ • ์›์†Œ์— ์ง์ ‘ ์ ‘๊ทผ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์›์†Œ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ฒซ๋ฒˆ์งธ ์›์†Œ๋ถ€ํ„ฐ ์„ ํ˜• ๊ฒ€์ƒ‰์„ ํ•ด์•ผํ•˜๋Š” ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

 

๐Ÿ”ถ ํŠน์ง•

  • ๋‹จ์ˆœ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ (Singly Linked List)
    • ๊ฐ ๋…ธ๋“œ๊ฐ€ ๋‹ค์Œ ๋…ธ๋“œ์— ๋Œ€ํ•ด์„œ๋งŒ ์ฐธ์กฐํ•˜๋Š” ๊ฐ€์žฅ ๋‹จ์ˆœํ•œ ํ˜•ํƒœ์˜ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ ์ž…๋‹ˆ๋‹ค.
    • Head๋…ธ๋“œ๋ฅผ ์ฐธ์กฐํ•˜๋Š” ์ฃผ์†Œ๋ฅผ ์žƒ์–ด๋ฒ„๋ฆด ๊ฒฝ์šฐ ๋ฐ์ดํ„ฐ ์ „์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ•˜๋Š” ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
    • ๋ณดํ†ต Queue(ํ)๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ ์ฃผ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
    • FAT ํŒŒ์ผ ์‹œ์Šคํ…œ์ด ๋‹จ์ผ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋กœ ํŒŒ์ผ ์ฒญํฌ(๋™์  ๋ฉ”๋ชจ๋ฆฌ๋กœ ํ• ๋‹น๋˜๋Š” ์˜์—ญ)์„ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

         

์ถœ์ฒ˜ : https://devowen.com/210

 

 

  • ์ด์ค‘ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ (Double Linked List)
    • ๊ฐ ๋…ธ๋“œ๊ฐ€ ์ด์ „ ๋…ธ๋“œ, ๋‹ค์Œ ๋…ธ๋“œ์— ๋Œ€ํ•ด์„œ ์ฐธ์กฐํ•˜๋Š” ํ˜•ํƒœ์˜ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ ์ž…๋‹ˆ๋‹ค.
    • ์‚ญ์ œ๊ฐ€ ๊ฐ„ํŽธํ•˜๋ฉฐ ๋‹จ์ผ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์— ๋น„ํ•ด ๋ฐ์ดํ„ฐ ์†์ƒ์— ๊ฐ•ํ•˜์ง€๋งŒ, ๊ด€๋ฆฌํ•  ์ฐธ์กฐ๊ฐ€ 2๊ฐœ์ด๊ธฐ ๋•Œ๋ฌธ์— ์‚ฝ์ž…์ด๋‚˜ ์ •๋ ฌ์˜ ๊ฒฝ์šฐ ์ž‘์—…๋Ÿ‰์ด ๋” ๋งŽ์Šต๋‹ˆ๋‹ค.

         

์ถœ์ฒ˜ : https://devowen.com/210

 

  • ์›ํ˜• ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ (Circular Linked List)
    • ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์—์„œ ๋งˆ์ง€๋ง‰ ์š”์†Œ๊ฐ€ ์ฒซ๋ฒˆ์งธ ์š”์†Œ๋ฅผ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค.
    • ์ŠคํŠธ๋ฆผ ๋ฒ„ํผ์˜ ๊ตฌํ˜„์— ๋งŽ์ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

         

์ถœ์ฒ˜ : https://devowen.com/210

 

๐Ÿ”ถ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ ๊ตฌํ˜„ (์ž๋ฐ”)

 

/*
 * @ TITLE Linked List (์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ)
 */
// List๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” Node ํด๋ž˜์Šค
class ListNode{
    private String data;    // ๋ฐ์ดํ„ฐ ์ €์žฅ ๋ณ€์ˆ˜
    public ListNode link;    // ๋‹ค๋ฅธ ๋…ธ๋“œ๋ฅผ ์ฐธ์กฐํ•  ๋งํฌ ๋…ธ๋“œ
    
    public ListNode() {
        this.data = null;
        this.link = null;
    }
    
    public ListNode(String data) {
        this.data = data;
        this.link = null;
    }
    
    public ListNode(String data, ListNode link) {
        this.data = data;
        this.link = link;
    }
    
    public String getData() {
        return this.data;
    }
}
public class LinkedList {
    
    private ListNode head;    // ListNode ํƒ€์ž…์˜ head ๋…ธ๋“œ ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜
    
    // LinkedList ์ƒ์„ฑ์ž
    public LinkedList() {
        head = null;    // head ๋…ธ๋“œ ์ดˆ๊ธฐํ™”
    }
    
    // Node ์‚ฝ์ž… (์ค‘๊ฐ„์— ์‚ฝ์ž…)
    public void insertNode(ListNode preNode, String data) {       
        ListNode newNode = new ListNode(data);    // ์ƒˆ๋กœ์šด ๋…ธ๋“œ ์ƒ์„ฑ
        
        // preNode.link๋Š” preNode์˜ ๋‹ค์Œ ๋…ธ๋“œ์ด๋ฏ€๋กœ,
        // newNode.link = preNode.link๋Š” ์ƒˆ๋กœ์šด ๋…ธ๋“œ์˜ link๊ฐ€ preNode์˜ ๋‹ค์Œ ๋…ธ๋“œ๋ฅผ ์ฐธ์กฐํ•˜๋„๋ก ํ•จ. 
        newNode.link = preNode.link;
        
        // preNode์˜ link๊ฐ€ ์ƒˆ๋กœ์šด ๋…ธ๋“œ๋ฅผ ์ฐธ์กฐํ•˜๋„๋ก ํ•จ.
        // ์ตœ์ข…์ ์œผ๋กœ 'preNode -> newNode -> ๊ธฐ์กด preNode์˜ ๋‹ค์Œ ๋…ธ๋“œ '์ด๋ ‡๊ฒŒ ๊ตฌ์„ฑ๋จ.
        preNode.link = newNode;
    }
    
    // Node ์‚ฝ์ž… (๋งˆ์ง€๋ง‰์— ์‚ฝ์ž…)
    public void insertNode(String data) {
        ListNode newNode = new ListNode(data);    // ์ƒˆ๋กœ์šด ๋…ธ๋“œ ์ƒ์„ฑ
        if(head == null) {
            // head ๋…ธ๋“œ๊ฐ€ null์ธ ๊ฒฝ์šฐ ์ƒˆ๋กœ์šด ๋…ธ๋“œ๋ฅผ ์ฐธ์กฐํ•˜๋„๋ก ํ•จ
            this.head = newNode;
        } else {
            // head ๋…ธ๋“œ๊ฐ€ null์ด ์•„๋‹Œ ๊ฒฝ์šฐ temp ๋…ธ๋“œ๊ฐ€ head๋ฅผ ์ฐธ์กฐ.
            // tempNode๋Š” ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ๋ฅผ ์ฐพ์•„์„œ ์ฐธ์กฐํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ.
            ListNode tempNode = head;
            
            // temp ๋…ธ๋“œ์˜ link๊ฐ€ null์ด ์•„๋‹ ๋•Œ๊นŒ์ง€ ๋‹ค์Œ ๋…ธ๋“œ๋ฅผ ์ฐธ์กฐ.
            // tempNode.link๋Š” ๋‹ค์Œ ๋…ธ๋“œ๋ฅผ ์ฐธ์กฐํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ,
            // tempNode = tempNode.link๋Š” tempNode์— ๋‹ค์Œ ๋…ธ๋“œ๋ฅผ ์ฐธ์กฐํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ.
            // while๋ฌธ์ด ๋ชจ๋‘ ์‹คํ–‰๋˜๋ฉด tempNode๋Š” ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ๋ฅผ ์ฐธ์กฐํ•˜๊ฒŒ ๋จ.
            while(tempNode.link != null) {
                tempNode = tempNode.link;    // ๋‹ค์Œ ๋…ธ๋“œ๋ฅผ ์ฐธ์กฐ
            }
            
            // tempNode(๋งˆ์ง€๋ง‰ ๋…ธ๋“œ)์˜ link๊ฐ€ ๋‹ค์Œ ๋…ธ๋“œ๋ฅผ ์ฐธ์กฐํ•˜๋„๋ก ํ•จ. 
            tempNode.link = newNode;
        }
    }
    
    // Node ์‚ญ์ œ(์ค‘๊ฐ„ ๋…ธ๋“œ ์‚ญ์ œ)
    public void deleteNode(String data) {
        // preNode๋Š” head๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋…ธ๋“œ๋ฅผ ํ• ๋‹น
        ListNode preNode = head;
        // tempNode๋Š” head๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋…ธ๋“œ์˜ ๋‹ค์Œ ๋…ธ๋“œ. ์ฆ‰, preNode์˜ ๋‹ค์Œ ๋…ธ๋“œ๋ฅผ ํ• ๋‹น
        ListNode tempNode = head.link; 
        
        // ์ฃผ์–ด์ง„ ๋ฐ์ดํ„ฐ๊ฐ€ preNode์˜ ๋ฐ์ดํ„ฐ์™€ ์ผ์น˜ํ•˜๋Š” ๊ฒฝ์šฐ
        // ์ฆ‰, ์ฒซ๋ฒˆ์งธ ๋…ธ๋“œ์˜ ๋ฐ์ดํ„ฐ์™€ ์ผ์น˜ํ•˜๋Š” ๊ฒฝ์šฐ
        if(data.equals( preNode.getData() )) {
            // head๋Š” preNode์˜ ๋‹ค์Œ ๋…ธ๋“œ๋ฅผ ์ฐธ์กฐํ•˜๋„๋ก ํ•จ.
            head = preNode.link;
            // preNode์˜ link๋Š” null์„ ํ• ๋‹นํ•˜์—ฌ ์—ฐ๊ฒฐ์„ ๋Š์Œ.
            preNode.link = null;
        } else {
            // tempNode๊ฐ€ null์ผ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณตํ•˜์—ฌ ํƒ์ƒ‰
            while(tempNode != null) {
                // ์ฃผ์–ด์ง„ ๋ฐ์ดํ„ฐ์™€ temp ๋…ธ๋“œ์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์ผ์น˜ํ•  ๊ฒฝ์šฐ.
                if(data.equals( tempNode.getData() )) {
                    // tempNode๊ฐ€ ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ์ธ ๊ฒฝ์šฐ
                    if(tempNode.link == null) {
                        preNode.link = null;
                    } else {
                        // tempNode๊ฐ€ ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ
                        // preNode์˜ link๋Š” tempNode์˜ ๋‹ค์Œ ๋…ธ๋“œ๋ฅผ ์ฐธ์กฐ.
                        // tempNode์˜ link๋Š” null์„ ํ• ๋‹นํ•˜์—ฌ ๋‹ค์Œ ๋…ธ๋“œ๋กœ์˜ ์—ฐ๊ฒฐ์„ ๋Š์Œ.
                        preNode.link = tempNode.link;
                        tempNode.link = null;
                    }
                    break;
                } else {
                    // ๋ฐ์ดํ„ฐ๊ฐ€ ์ผ์น˜ํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ 
                    // preNode์— tempNode๋ฅผ ํ• ๋‹นํ•˜๊ณ , tempNode์— ๋‹ค์Œ ๋…ธ๋“œ ํ• ๋‹น.
                    preNode = tempNode;
                    tempNode = tempNode.link;
                }
            }
        }
    }
    
    // Node ์‚ญ์ œ(๋งˆ์ง€๋ง‰ ๋…ธ๋“œ ์‚ญ์ œ)
    public void deleteNode() {
        ListNode preNode;
        ListNode tempNode;
        
        // head ๋…ธ๋“œ๊ฐ€ null์ธ ๊ฒฝ์šฐ ๋ชจ๋“  ๋…ธ๋“œ๊ฐ€ ์‚ญ์ œ๋˜์—ˆ์œผ๋ฏ€๋กœ return
        if(head == null) {
            return;
        }
        
        // head ๋…ธ๋“œ์˜ link๊ฐ€ null์ธ ๊ฒฝ์šฐ
        // ๋…ธ๋“œ๊ฐ€ 1๊ฐœ ๋‚จ์•˜์„ ๊ฒฝ์šฐ
        if(head.link == null) {
            // head์— null์„ ํ• ๋‹นํ•˜์—ฌ ๋‚จ์€ ๋…ธ๋“œ์™€์˜ ์—ฐ๊ฒฐ์„ ๋Š์Œ.
            head = null;
        } else {
            // preNode๋Š” head๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋…ธ๋“œ๋ฅผ ํ• ๋‹น
            preNode = head;
            // tempNode๋Š” head๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋…ธ๋“œ์˜ ๋‹ค์Œ ๋…ธ๋“œ. ์ฆ‰, preNode์˜ ๋‹ค์Œ ๋…ธ๋“œ๋ฅผ ํ• ๋‹น
            tempNode = head.link;     
            
            // tempNode์˜ link๊ฐ€ null์ด ์•„๋‹ ๋•Œ๊นŒ์ง€ ํ•œ ๋…ธ๋“œ์”ฉ ๋‹ค์Œ ๋…ธ๋“œ๋กœ ์ด๋™.
            // preNode๋Š” tempNode๋ฅผ ํ• ๋‹นํ•˜๊ณ 
            // tempNode๋Š” tempNode์˜ ๋‹ค์Œ ๋…ธ๋“œ๋ฅผ ํ• ๋‹น.
            // ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด preNode๋Š” ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ์˜ ์ด์ „ ๋…ธ๋“œ๊ฐ€ ๋˜๊ณ , tempNode๋Š” ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ๊ฐ€ ๋จ.
            while(tempNode.link != null) {
                preNode = tempNode;
                tempNode = tempNode.link;
            }
            
            // preNode์˜ link๋ฅผ null๋กœ ๋งŒ๋“ค์–ด์„œ ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ๋ฅผ ์‚ญ์ œ
            // ์ฆ‰, preNode์˜ ๋‹ค์Œ ๋…ธ๋“œ์ธ tempNode๋กœ์˜ ์—ฐ๊ฒฐ์„ ๋Š์Œ.
            preNode.link = null;
        }
    }
    
    // Node ํƒ์ƒ‰
    public ListNode searchNode(String data) {
        ListNode tempNode = this.head;    // temp ๋…ธ๋“œ์— head๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ฒซ ๋ฒˆ์งธ ํ• ๋‹น.
        
        // temp ๋…ธ๋“œ๊ฐ€ null์ด ์•„๋‹ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณตํ•˜์—ฌ ํƒ์ƒ‰
        while(tempNode != null) {
            // ์ฃผ์–ด์ง„ ๋ฐ์ดํ„ฐ์™€ temp ๋…ธ๋“œ์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์ผ์น˜ํ•  ๊ฒฝ์šฐ ํ•ด๋‹น temp ๋…ธ๋“œ๋ฅผ return
            if(data.equals(tempNode.getData())) {
                return tempNode;
            } else {
                // ๋ฐ์ดํ„ฐ๊ฐ€ ์ผ์น˜ํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ temp ๋…ธ๋“œ์— ๋‹ค์Œ ๋…ธ๋“œ ํ• ๋‹น.
                tempNode = tempNode.link;
            }
        }
        
        return tempNode;
    }
    
    // ๋ฆฌ์ŠคํŠธ์˜ ๋…ธ๋“œ๋ฅผ ์—ญ์ˆœ์œผ๋กœ ๊ตฌ์„ฑ
    public void reverseList() {
        ListNode nextNode = head;    // head๊ฐ€ ์ฐธ์กฐํ•˜๋Š” ์ฒซ๋ฒˆ์งธ ๋…ธ๋“œ๋ฅผ ํ• ๋‹น.
        ListNode currentNode = null;
        ListNode preNode = null;
        
        // nextNode๊ฐ€ ์ˆœ์ฐจ์ ์œผ๋กœ ์ด๋™ํ•˜๋ฉฐ currentNode์˜ link๊ฐ€ preNode๋ฅผ ์ฐธ์กฐํ•˜๋„๋ก ํ•จ.
        // 1) preNode๋ฅผ currentNode ์œ„์น˜๋กœ ์ด๋™
        // 2) currentNode๋Š” nextNode ์œ„์น˜๋กœ ์ด๋™
        // 3) nextNode๋Š” ๋‹ค์Œ ๋…ธ๋“œ ์œ„์น˜๋กœ ์ด๋™
        // 4) currentNode์˜ link๋Š” preNode๋ฅผ ์ฐธ์กฐํ•˜๋„๋ก ํ•จ
        while(nextNode != null) {
            preNode = currentNode;    // preNode๋Š” currentNode ์œ„์น˜๋กœ ์ด๋™
            currentNode = nextNode;    // currentNode๋Š” nextNode ์œ„์น˜๋กœ ์ด๋™

						currentNode.link = preNode;    // currentNode์˜ link์— preNode๋ฅผ ํ• ๋‹นํ•˜์—ฌ ์—ญ์ˆœ์œผ๋กœ ์„ค์ •
        }
        
        head = currentNode;    // currentNode๊ฐ€ ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ฌ ๋•Œ, head๋Š” currentNode๋ฅผ ์ฐธ์กฐํ•˜๋„๋ก ํ•จ.
    }
    
    // ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์— ์ €์žฅ๋œ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ์ถœ๋ ฅ
    public void printList() {
        ListNode tempNode = this.head;    // tempNode์— head๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ฒซ๋ฒˆ์งธ ๋…ธ๋“œ๋ฅผ ํ• ๋‹น
        
        // tempNode๊ฐ€ null์ด ์•„๋‹ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณตํ•˜์—ฌ ์ถœ๋ ฅ
        while(tempNode != null) {
            System.out.print(tempNode.getData() + " ");
            tempNode = tempNode.link;    // temp ๋…ธ๋“œ์— ๋‹ค์Œ ๋…ธ๋“œ(tempNode.link) ํ• ๋‹น.
        }
        System.out.println();
    }
 
    public static void main(String args[]) {
        LinkedList linkedList = new LinkedList();    // ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ ์ƒ์„ฑ
        String str = "wed";
        
        linkedList.insertNode("sun");
        linkedList.insertNode("mon");
        linkedList.insertNode("tue");
        linkedList.insertNode("wed");
        linkedList.insertNode("thu");
        linkedList.insertNode("fri");
        linkedList.insertNode("sat");
        linkedList.printList();
        
        System.out.println(linkedList.searchNode(str).getData());
        
        linkedList.deleteNode(linkedList.searchNode(str).getData());
        linkedList.printList();
        
        str = "sun";
        
        linkedList.deleteNode(linkedList.searchNode(str).getData());
        linkedList.printList();
        
        linkedList.reverseList();
        linkedList.printList();
    }
}

 


reference

https://devowen.com/210

 

DS #2. ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ (LinkedList)

๋‘ ๋ฒˆ์งธ๋กœ ์ž๋ฃŒ๊ตฌ์กฐ์—์„œ ์‚ดํŽด ๋ณผ ๋‚ด์šฉ์€ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ(LinkedList)์ด๋‹ค. ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋Š” ์–ด๋–ค ๋ฐ์ดํ„ฐ ๋ฉ์–ด๋ฆฌ(์ด๋ฅผ ๋…ธ๋“œ๋ผ๊ณ  ํ‘œํ˜„)๋ฅผ ์ €์žฅํ•  ๋•Œ, ๊ทธ ๋‹ค์Œ ์ˆœ์„œ์˜ ์ž๋ฃŒ๊ฐ€ ์žˆ๋Š” ์œ„์น˜๋ฅผ ๋ฐ์ด

devowen.com

 

https://namu.wiki/w/%EC%97%B0%EA%B2%B0%20%EB%A6%AC%EC%8A%A4%ED%8A%B8

 

์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ - ๋‚˜๋ฌด์œ„ํ‚ค

๋ฐฐ์—ด๊ณผ๋Š” ๋‹ฌ๋ฆฌ ์ฒซ๋ฒˆ์งธ ๋ฐ์ดํ„ฐ์˜ ์ถ”๊ฐ€/์‚ญ์ œ๊ฐ€ O(1)์˜ ์‹œ๊ฐ„์•ˆ์— ์ˆ˜ํ–‰๋œ๋‹ค. ๋ฐฐ์—ด์˜ ๊ฒฝ์šฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ ๋˜๋Š” ์‚ญ์ œํ•  ๋•Œ ํ•ด๋‹น ์ง€์  ๋’ค์ชฝ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ชจ๋‘ ์ด๋™ํ•ด์•ผ ํ•˜๋‚˜ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋Š” ๊ทธ๋Ÿด ํ•„์š”๊ฐ€

namu.wiki

 

https://freestrokes.tistory.com/84

 

Java๋กœ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ(Linked List) ๊ตฌํ˜„ํ•˜๊ธฐ

Java๋กœ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ(Linked List) ๊ตฌํ˜„ํ•˜๊ธฐ Java๋กœ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ(Linked List)๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. 1. ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ(Linked List) ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๋Š” ๊ฐ ๋…ธ๋“œ๊ฐ€ ๋ฐ์ดํ„ฐ์™€ ํฌ์ธํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ํ•œ ์ค„

freestrokes.tistory.com