001 go 语言实现单链表

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()

}

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,047评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,807评论 3 386
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,501评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,839评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,951评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,117评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,188评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,929评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,372评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,679评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,837评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,536评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,168评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,886评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,129评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,665评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,739评论 2 351

推荐阅读更多精彩内容