美文网首页
001 go 语言实现单链表

001 go 语言实现单链表

作者: 愚蠢的二师弟 | 来源:发表于2020-03-08 17:43 被阅读0次
1 单链表的定义

代码仓库
https://gitee.com/babyb/data_srtuct

引用百度百科:
https://baike.baidu.com/item/%E5%8D%95%E9%93%BE%E8%A1%A8/3228368?fr=aladdin
单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) + 指针(指示后继元素存储位置),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据。

image.png
2 实现的功能

1 判断链表是否为空
2 单链表的长度
3 从头部加入单元素
4 尾部加入元素
5 指定位置元素
6 删除指定元素
7 删除指定位置的元素
8 查看是否包含某个元素
9 遍历/展示所有元素

数据结构定义
type Object interface {}

type Node struct{
    Data Object  //数据域
    Next *Node   //定义地址域 ( 指向下一个表的地址)
}

type List struct{
    headNode *Node //头结点
}
3 每一个方法
3.1 判断链表是否为空
func (this *List) IsEmpty() bool{
    if this.headNode == nil{
        return true
    }else{
        return false
    }
}
3.2获取链表长度
func (this *List) Length() int{
    // 第一步, 获取链表的头结点
    cur := this.headNode;
    //定义一个计数器
    count := 0;
    for cur != nil{
        count ++
        cur = cur.Next
    }
    return count
}
3.3从链表头部添加元素
func (this *List) Add(data Object) *Node{
    node := &Node{ Data: data}
    node.Next = this.headNode
    this.headNode = node;
    return node;
}
3.4 链表尾部添加元素
func (this *List) Append(data Object){
    node := &Node{Data: data}
    if this.IsEmpty(){
        //如果是空链表, 直接将该元素作为头结点
        this.headNode = node
    }else{
        cur := this.headNode
        //定义变量用于存储头结点
        for cur.Next != nil{
            cur = cur.Next
        }
        cur.Next = node
    }
}
3.5链表指定位置添加元素
func (this *List) Insert(index int, data Object){
    if index <0{
        //在链表头部添加元素
        this.Add(data)
    }else if index > this.Length(){
        this.Append(data)
    }else{
        pre :=this.headNode
        count := 0;
        //先查找到指定位置的前一个元素
        for count < (index - 1) {
            pre = pre.Next
            count++
        }
        // 创建新结点
        node := &Node{Data: data}
        node.Next = pre.Next;
        pre.Next = node
    }
}
3.6删除链表指定值的元素
func (this *List) Remove( data Object){
    pre := this.headNode
    if pre.Data == data{
        // 删除头部元素
        this.headNode = pre.Next
    }else{
        for pre.Next != nil{
            if pre.Next.Data == data{
                //找到了指定元素, pre.Next  指向更靠后的那个元素
                pre.Next = pre.Next.Next
            }else{
                // 如果没找到指定元素
                pre = pre.Next
            }
        }
    }

}
3.7 删除链表指定下标的元素
func (this *List) RemoveByIndex(index int){
    pre := this.headNode
    if index <= 0{
        //移除头结点
        this.headNode = pre.Next
    }else if index > this.Length(){
        fmt.Println("超出链表长度")
        return
    }else{
        //
        count := 0;
        for count != (index -1) && pre.Next != nil{
            count ++
            pre = pre.Next
        }
        pre.Next = pre.Next.Next
    }
}
3.8查看链表是否包含某个元素
func (this *List) Contain(data Object) bool {
    cur := this.headNode
    for cur != nil{
        if cur.Data == data {
            return true
        }
        cur = cur.Next
    }
    return false
}
3.9 遍历所有结点
func (this *List) ShowList(){
    if !this.IsEmpty(){
        cur := this.headNode
        for cur != nil{
            fmt.Printf("\t %v", cur.Data)
            cur = cur.Next
        }
    }
}
3.10 占位符说明

fmt 中各种占位符, 参考下面这篇文章
https://studygolang.com/articles/2644

4 测试代码
package main

import (
    "data_struct/single_link_list"
    "fmt"
)

func main(){
    fmt.Println("测试单链表")
    list := linkedList.List{}
    list.Append(1)
    list.Append(2)
    list.Append(3)

    list.Append("a")
    list.Append("b")
    list.Append("c")
    fmt.Printf("链表的长度 %d\n", list.Length())

    //fmt.Print("链表当前的内容为:")
    //list.ShowList();

    //判断链表是否为空
    //list2 := linkedList.List{}
    //fmt.Printf("list 是否为空链表 : %t\n", list.IsEmpty())
    //fmt.Printf("list2 是否为空链表 : %t\n", list2.IsEmpty())

    //指定位置插入元素
    list.Insert(3, "第三个index的值")
    //fmt.Print("链表当前元素内容:")
    //list.ShowList();

    //测试是否包含某个元素
    fmt.Println("是否包含 第三个index的值",  list.Contain("第三个index的值"))

    //删除元素
    //list.Remove("第三个index的值")
    //list.ShowList();

    //从第三个位置删除
    list.RemoveByIndex(3)
    list.ShowList()

}

相关文章

  • 001 go 语言实现单链表

    1 单链表的定义 代码仓库https://gitee.com/babyb/data_srtuct 引用百度百科:h...

  • 单链表的C语言算法实现

    单链表的C语言算法实现 自己用C语言实现的单链表算法,有什么不正确的地方,请各位共同讨论与指正。

  • (4)Go实现单链表

    链表(Linked list)是一种 “动态数据结构”,链表由节点构成node链接构成,但是并不会按线性的顺序存储...

  • 单链表的Go实现

    单链表是最简单的数据结构之一,它也是许多高级数据结构的基础,所以十分重要。将熟悉的数据结构用新编程语言重新实现一次...

  • 线性表之单链表实现

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

  • go语言container包中的那些容器

    go语言container包中的那些容器 主要内容 List和Element。前者实现了一个双向链表(以下简称链表...

  • 25_静态单链表的实现

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

  • 链表基本操作

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

  • [go语言算法] 单链表反转

    思路:单链表反转Head -> Node1 -> Node2 -> Node3 -> Node4如果将一个节点的n...

  • go-map源码简单分析(map遍历为什么时随机的)

    GO 中map的底层是如何实现的 首先Go 语言采用的是哈希查找表,并且使用链表解决哈希冲突。 GO的内存模型 先...

网友评论

      本文标题:001 go 语言实现单链表

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