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