博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[数据结构]之链表
阅读量:5067 次
发布时间:2019-06-12

本文共 2683 字,大约阅读时间需要 8 分钟。

[数据结构]之链表

 1 描述
链表:对于当前链表中元素,除了存储本身的值,还存储有指示后面元素的地址(通常是指针或引用)。

节点:每一个链表的元素称为一个节点。

2 数据结构
节点Node,链表Linklist

1)节点属性

存储的数据 data

指向下一元素的指针 next

2)链表属性

链表的起始节点 begin

当前长度

3)操作

Get(index)获取元素

Insert(index,elem) 插入元素

Delete(index) 删除第i个元素

3 go语言实现

package main        import (        "fmt"    )        /*     *    定义节点     */    type Node struct {        Data string        Next *Node    }        /*     *    定义链表     */    type LinkList struct {        Begin  *Node        Length int    }        /*     *    获取顺序表的第index元素     */    func (list *LinkList) Get(index int) (*Node, error) {            if list.Length == 0 || index < 0 || index > list.Length-1 {            return nil, fmt.Errorf("the index %d Out Of Bounds", index)            }            var retElem *Node        retElem = list.Begin        //循环节点,查到下一个元素        for i := 1; i <= index; i++ {            retElem = retElem.Next        }        return retElem, nil    }        /*     *    插入顺序表元素,在第index位置     */    func (list *LinkList) Insert(index int, elem *Node) error {            if index < 0 || index > list.Length {            return fmt.Errorf("the index %d Out Of Bounds", index)        }        //是否插入到第一个位置        if index == 0 {            elem.Next = list.Begin            list.Begin = elem            list.Length++            return nil        }            //修改前一节点和插入元素的指向        curElem, err := list.Get(index - 1)        if err != nil {            fmt.Println(err)            return err        }        elem.Next = curElem.Next        curElem.Next = elem        list.Length++        return nil    }        /*     *    删除顺序表元素,在第index位置     */    func (list *LinkList) Delete(index int) error {        if list.Length == 0 {            return fmt.Errorf("the list is empty")        }        if index < 0 || index > list.Length {            return fmt.Errorf("the index %d Out Of Bounds", index)        }            //是否删除第一个位置        if index == 0 {            list.Begin = list.Begin.Next            list.Length--            return nil        }            //修改后一节点和删除元素的指向        curElem, err := list.Get(index - 1)        if err != nil {            fmt.Println(err)            return err        }        curElem.Next = curElem.Next.Next        list.Length--        return nil        }        func main() {        list := &LinkList{}            list.Insert(0, &Node{Data: "AAAAA"})        list.Insert(1, &Node{Data: "BBBBB"})        list.Insert(2, &Node{Data: "CCCCC"})            list.Delete(1)            for i := 0; i < list.Length; i++ {            elem, _ := list.Get(i)            fmt.Printf("get elem %d value:%v\n", i, elem.Data)        }        }

 

转载于:https://www.cnblogs.com/sxt102400/p/3234242.html

你可能感兴趣的文章
(转)盒子概念和DiV布局
查看>>
Android快速实现二维码扫描--Zxing
查看>>
获取元素
查看>>
nginx+lighttpd+memcache+mysql配置与调试
查看>>
ubuntu12.04 启动apache2 对.htaccess 的支持
查看>>
proxy写监听方法,实现响应式
查看>>
前端工具----iconfont
查看>>
Azure Site Recovery 通过一键式流程将虚拟机故障转移至 Azure虚拟机
查看>>
Hello China操作系统STM32移植指南(一)
查看>>
cocos2dx CCEditBox
查看>>
VC++2012编程演练数据结构《8》回溯法解决迷宫问题
查看>>
第一阶段冲刺06
查看>>
WIN下修改host文件并立即生效
查看>>
十个免费的 Web 压力测试工具
查看>>
ckeditor 粘贴后去除html标签
查看>>
面试题
查看>>
51Nod:活动安排问题之二(贪心)
查看>>
EOS生产区块:解析插件producer_plugin
查看>>
数据库框架的log4j日志配置
查看>>
lintcode-easy-Remove Element
查看>>