[数据结构]之链表

[数据结构]之链表
 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)
        }
    
    }
原文地址:https://www.cnblogs.com/sxt102400/p/3234242.html