go 實現單向連結串列

littlexiaoshuishui發表於2020-05-26

單連結串列
Node: 包含一個資料域,一個指標域(指向下一個節點)
LList : 包含頭指標(指向第一個節點),連結串列長度
連結串列的特點:不能隨機訪問,只能根據鏈一個一個查詢,查詢的時間複雜度是O(n)

type Node struct {
    Data interface{}
    Next *Node
}

type LList struct {
    Header *Node //指向第一個節點
    Length int
}

func CreateNode(v interface{}) *Node{
    return &Node{v, nil}
}
func CreateList()  *LList{
    header := CreateNode(nil)
    return &LList{header,0}
}

//往連結串列頭增加一個節點,
func (l *LList)Add(data interface{}){
    newNode := CreateNode(data)
    defer func() {
        l.Length++
    }()

    if l.Length == 0 {
        l.Header = newNode
    }else{
        newNode.Next  = l.Header
        l.Header = newNode //頭指標指向新加的
    }

}
//往連結串列尾加一個節點
func (l *LList)Append(data interface{}){
    newNode := CreateNode(data)
    defer func() {
        l.Length++
    }()

    if l.Length==0{
        l.Header = newNode
    }
    if l.Length>0 {
        current := l.Header
        for current.Next != nil{ //迴圈找到最後一個節點
            current = current.Next
        }
        current.Next = newNode //把新節點地址給最後一個節點的Next
    }
}

//往i插入一個節點,後插
func (l *LList)Insert(i int, data interface{}){
    defer func() {
        l.Length++
    }()

    if i>=l.Length {
        l.Append(data)
        return
    }
    newNode := CreateNode(data)
    //找到第i個節點pre和i+1個after節點
    j := 1
    pre := l.Header
    for j!=i{
        pre = pre.Next
        j++
    }
    after := pre.Next //獲取到i+1個節點
    //修改i節點,新節點的指標
    pre.Next = newNode
    newNode.Next = after
}

//刪除第i個節點
func (l *LList)Delete(i int){
    defer func() {
        l.Length--
    }()
    if i==1{ //刪除第一個節點,把header指向第二個節點即可
        l.Header = l.Header.Next
        return
    }
    //找到第i-1個節點,找到第i+1個節點,修改i-1的節點的next即可
    j := 0
    current := l.Header
    for j == i-1 {
        current = current.Next
        j++
    }
    after := current.Next.Next
    current.Next = after
}

//遍歷連結串列,顯示出來
func (l *LList)Scan() {
    current := l.Header
    i := 1
    for current.Next != nil{
        fmt.Printf("第%d的節點是%d\n", i, current.Data)
        current = current.Next
        i++
    }
    fmt.Printf("第%d的節點是%d\n", i, current.Data)

}
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章