美文网首页Golang
golang 实现单链表

golang 实现单链表

作者: 高小震 | 来源:发表于2017-12-27 14:36 被阅读305次

    单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) + 指针(指示后继元素存储位置),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据。

    golang代码实现:

    package main
    
    import (
        "fmt"
        "errors"
    )
    
    //定义数据类型
    type Element string
    
    //定义节点
    type linkNode struct {
        Data Element   //数据
        Next *linkNode //指向下一个节点
    }
    
    //链表头
    type HeadLinkNode struct {
        Length int
        Node   *linkNode
    }
    
    //定义节点接口
    type LinkNoder interface {
        Add(node Element)               //增加尾部
        Remove(index int) error         //删除指定位置的node
        Insert(index int, node Element) //指定位置插入节点
        Len() int                       //查询长度
        Search(node Element) int        //查询位置
        Get(index int) *linkNode        //查询位置
    }
    
    func New() LinkNoder {
        return &HeadLinkNode{Length: 0, Node: &linkNode{Data: "", Next: nil}}
    }
    
    //增加末尾节点
    func (h *HeadLinkNode) Add(node Element) {
        l := h.Node
        for {
            if l.Next == nil {
                newNode := &linkNode{Data: node, Next: nil}
                l.Next = newNode
                break
            } else {
                l = l.Next
            }
        }
        h.Length++
    }
    
    //删除第INDEX位置的节点,节点从1开始计算
    func (h *HeadLinkNode) Remove(index int) error {
        l := h.Node
        lLen := h.Len()
        if index < 1 || index > lLen {
            return errors.New("index error")
        }
        for i := 0; i < index-1; i++ {
            l = l.Next
        }
        if index == lLen {
            l.Next = nil
        } else {
            l.Next = l.Next.Next
        }
        h.Length--
        return nil
    }
    
    //在链表的第Index位置增加节点
    func (h *HeadLinkNode) Insert(index int, node Element) {
        l := h.Node
        lLen := h.Len()
        if index < 1 || index > lLen {
            return
        }
        for i := 0; i < index-1; i++ {
            l = l.Next
        }
        newNode := &linkNode{Data: node, Next: l.Next}
        l.Next = newNode
        h.Length++
    }
    
    //查询链表的长度
    func (h *HeadLinkNode) Len() int {
        l := h.Node
        i := 0
        for l.Next != nil {
            i++
            l = l.Next
        }
        if i != h.Length {
            fmt.Println("------")
            fmt.Println(i)
            fmt.Println(h.Length)
            fmt.Println("------")
        }
        return i
    }
    
    //查询节点数据在第几个
    func (h *HeadLinkNode) Search(node Element) int {
        l := h.Node
        i := 0
        for {
            i++
            if l.Next != nil && l.Next.Data == node {
                return i
            } else {
                return 0
            }
        }
        return 0
    }
    
    //获取链表的第几个节点
    func (h *HeadLinkNode) Get(index int) *linkNode {
        lLen := h.Len()
        if index < 1 || index > lLen {
            return nil
        }
        l := h.Node
        for i := 0; i < index; i++ {
            l = l.Next
        }
        return l
    }
    
    func main() {
        l := New()
        l.Add(Element("zhangsan"))
        fmt.Println("wz:",l.Search(Element("zhangsan")))
        l.Remove(1)
        fmt.Println(l.Len())
        l.Add(Element("zhangsan"))
        fmt.Println(l.Len())
        l.Insert(1, Element("wangwu"))
        fmt.Println(l.Len())
        fmt.Println(l.Remove(l.Len()))
        fmt.Println(l.Len())
        fmt.Println(l.Search(Element("zhangsan")))
        fmt.Println(l.Search(Element("wangwu")))
        fmt.Println(l.Get(l.Len()))
    
    
    }
    
    
    

    相关文章

      网友评论

        本文标题:golang 实现单链表

        本文链接:https://www.haomeiwen.com/subject/xfjugxtx.html