[数据结构]之链表
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) } }