golang 实现单链表

赵雍 · · 2534 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

package main

//链表实现
import (
    "fmt"
    "os"
)

//定义错误常量
const (
    ERROR = -1000000001
)

//定义元素类型
type Element int64

//定义节点
type LinkNode struct {
    Data Element   //数据域
    Nest *LinkNode //指针域,指向下一个节点
}

//函数接口
type LinkNoder interface {
    Add(head *LinkNode, new *LinkNode)              //后面添加
    Delete(head *LinkNode, index int)               //删除指定index位置元素
    Insert(head *LinkNode, index int, data Element) //在指定index位置插入元素
    GetLength(head *LinkNode) int                   //获取长度
    Search(head *LinkNode, data Element)            //查询元素的位置
    GetData(head *LinkNode, index int) Element      //获取指定index位置的元素
}

//添加 头结点,数据
func Add(head *LinkNode, data Element) {
    point := head //临时指针
    for point.Nest != nil {
        point = point.Nest //移位
    }
    var node LinkNode  //新节点
    point.Nest = &node //赋值
    node.Data = data

    head.Data = Element(GetLength(head)) //打印全部的数据

    if GetLength(head) > 1 {
        Traverse(head)
    }

}

//删除 头结点 index 位置
func Delete(head *LinkNode, index int) Element {
    //判断index合法性
    if index < 0 || index > GetLength(head) {
        fmt.Println("please check index")
        return ERROR
    } else {
        point := head
        for i := 0; i < index-1; i++ {
            point = point.Nest //移位
        }
        point.Nest = point.Nest.Nest //赋值
        data := point.Nest.Data
        return data
    }
}

//插入 头结点 index位置 data元素
func Insert(head *LinkNode, index int, data Element) {
    //检验index合法性
    if index < 0 || index > GetLength(head) {
        fmt.Println("please check index")
    } else {
        point := head
        for i := 0; i < index-1; i++ {
            point = point.Nest //移位
        }
        var node LinkNode //新节点,赋值
        node.Data = data
        node.Nest = point.Nest
        point.Nest = &node
    }
}

//获取长度 头结点
func GetLength(head *LinkNode) int {
    point := head
    var length int
    for point.Nest != nil {
        length++
        point = point.Nest
    }
    return length
}

//搜索 头结点 data元素
func Search(head *LinkNode, data Element) {
    point := head
    index := 0
    for point.Nest != nil {
        if point.Data == data {
            fmt.Println(data, "exist at", index, "th")
            break
        } else {
            index++
            point = point.Nest
            if index > GetLength(head)-1 {
                fmt.Println(data, "not exist at")
                break
            }
            continue
        }
    }
}

//获取data 头结点 index位置
func GetData(head *LinkNode, index int) Element {
    point := head
    if index < 0 || index > GetLength(head) {
        fmt.Println("please check index")
        return ERROR
    } else {
        for i := 0; i < index; i++ {
            point = point.Nest
        }
        return point.Data
    }
}

//遍历 头结点
func Traverse(head *LinkNode) {
    point := head.Nest
    for point.Nest != nil {
        fmt.Println(point.Data)
        point = point.Nest
    }
    fmt.Println("Traverse OK!")
}

//主函数测试
func main() {
    var head LinkNode = LinkNode{Data: 0, Nest: nil}
    head.Data = 0
    var nodeArray []Element
    for i := 0; i < 10; i++ {
        nodeArray = append(nodeArray, Element(i+1+i*100))
        Add(&head, nodeArray[i])

    }

    Delete(&head, 3)
    Search(&head, 2032)
    Insert(&head, 23, 10010)
    Traverse(&head)
    fmt.Println("data is", GetData(&head, 6))
    fmt.Println("length:", GetLength(&head))
    os.Exit(0)
}

有疑问加站长微信联系(非本文作者)

本文来自:Segmentfault

感谢作者:赵雍

查看原文:golang 实现单链表

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

2534 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传