목록

리스트


  • 참조는 항상 빠르지는 않지만 삽입 및 삭제는 빠릅니다.
  • v.s. 배열 : 참조가 빠르지 만 삽입/삭제가 최악의 경우 $ O (n) $의 계산량이 걸린다.

  • 선형 목록




    package main
    
    import "fmt"
    
    type Cell struct {
        val int
        next *Cell
    }
    
    type LinkedList struct {
        head *Cell
    }
    
    func (l *LinkedList) Print() {
        cell := l.head
        for cell != nil {
            fmt.Printf("val: %d\n", cell.val)
            cell = cell.next
        }
    }
    
    func (l *LinkedList) Insert(val int, previous *Cell) {
        cell := NewCell(val)
        if previous == nil {
            fmt.Println("ERROR: Given previous cell does not exist yet.")
            return
        }
        cell.next = previous.next
        previous.next = cell
    }
    
    func (l *LinkedList) Prepend(val int) {
        cell := NewCell(val)
        cell.next = l.head
        l.head = cell
    }
    
    func (l *LinkedList) Append(val int) {
        cell := NewCell(val)
        last := l.head
        if last == nil {
            l.head = cell
            return
        }
        for last.next != nil {
            last = last.next
        }
        last.next = cell
    }
    
    func (l *LinkedList) Delete(val int) {
        if l.head == nil {
            fmt.Println("ERROR: linked list does not exist yet.")
            return
        }
        target := l.head
        var prev *Cell
        for target.next != nil {
            if target.val == val {
                break
            }
            prev = target
            target = target.next
        }
        if target == l.head {
            l.head = l.head.next
            return
        }
        prev.next = target.next
        target.next = nil
    }
    
    func NewCell(val int) *Cell {
        return &Cell{val: val, next: nil}
    }
    
    func NewLinkedList() *LinkedList {
        return &LinkedList{head: nil}
    }
    
    func main() {
        l0 := NewLinkedList()
        l0.head = NewCell(0)
        c1 := NewCell(1)
        c2 := NewCell(2)
        l0.head.next = c1
        c1.next = c2
        l0.Print()
        // val: 0
        // val: 1
        // val: 2
    
        l0.Prepend(-1)
        fmt.Println()
        l0.Print()
        // val: -1
        // val: 0
        // val: 1
        // val: 2
    
        l0.Append(99)
        fmt.Println()
        l0.Print()
        // val: -1
        // val: 0
        // val: 1
        // val: 2
        // val: 99
    
        l0.Insert(77, c2)
        fmt.Println()
        l0.Print()
        // val: -1
        // val: 0
        // val: 1
        // val: 2
        // val: 77
        // val: 99
    
        l0.Delete(0)
        fmt.Println()
        l0.Print()
    
        // val: -1
        // val: 1
        // val: 2
        // val: 77
        // val: 99
    }
    

    환상 목록



    양방향 목록



    마음이 가면 추기

    좋은 웹페이지 즐겨찾기