• [数据结构]之链表


    [数据结构]之链表
     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
    ", i, elem.Data)
            }
        
        }
  • 相关阅读:
    有关try..catch..finally处理异常的总结
    java中finally和return的执行顺序
    慢查询处理
    阿里云数据库配置文件
    在DEV c++ 中如何设置默认的代码模板
    「C语言」单链表/双向链表的建立/遍历/插入/删除
    使用VS.NET2019做为C++开发专用IDE
    Windows下通过SSH无密码连接Linux服务器
    海沧区磁盘扩容思路办法
    Rabbitmq异常排查
  • 原文地址:https://www.cnblogs.com/sxt102400/p/3234242.html
Copyright © 2020-2023  润新知