美文网首页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实现单链表

    转载请注明出处:数据结构——Golang实现单链表 1. 单链表 1.1. 定义 单向链表(单链表)是链表的一种,...

  • golang 实现单链表

    单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。链表中的数据是以结点来表示的,每个...

  • golang实现单链表

    输出结果

  • golang单链表的实现

    实现部分在linkedList包里面,具体实现的功能有:1.判断是否为空的单链表2.单链表的长度3.获取头节点4....

  • 线性表之单链表实现

    线性表之单链表实现 实现单链表的初始化、插入、删除等基本运算 实现单链表的输入、输出运算 实现单链表的逆置、归并、...

  • 25_静态单链表的实现

    关键词: 单链表的一个缺点、静态单链表设计思路、静态单链表的继承层次结构、静态单链表的实现思路、静态单链表的实现 ...

  • 链表基本操作

    1、删除单链表节点 2、插入单链表结点 单链表具体实现

  • 单链表 & 双链表& 单向循环链表的实现

    单链表 具体实现: 双链表 代码实现: 单向循环链表的实现 代码实现:

  • 链表

    单链表 C实现 Java实现 双链表 C实现 Java实现

  • leetcode 单链表的各种算法

    1 递归实现:合并两个有序的单链表 2 递归实现:单链表逆序存入vector 3 循环实现:快慢指针找到单链表中间...

网友评论

    本文标题:golang 实现单链表

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