go 实现单向链表

单链表
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 协议》,转载必须注明作者和本文链接
用过哪些工具?为啥用这个工具(速度快,支持高并发...)?底层如何实现的?
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!