重温一遍数据结构之单链表(golang版)

前端之家收集整理的这篇文章主要介绍了重温一遍数据结构之单链表(golang版)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

说明

上一篇说的是线性表中的顺序存储结构,他的读取复杂度虽然是o(1),但是它的缺点也很明显,插入和删除需要移动很多元素,而且需要分配一块连续的内存区域

线性表之单链表

单链表在一定程度上解决了一部分上面的问题,而且也不要一大块连续的内存区域,代码如下

package main

//线性表中的链式存储结构
//第一个节点为头节点,并不真实保存数据,头节点基本代表了整个链表

import (
    "fmt"
)

type Elem int

type LinkNode struct {
    Data Elem
    Next *LinkNode
}

//生成头节点
func New() *LinkNode {
    //下面的data可以用来表示链表的长度
    return &LinkNode{0,nil}
}

//在链表的第i个位置前插入一个元素e,复杂度为o(n)
func (head *LinkNode) Insert(i int,e Elem) bool {
    p := head
    j := 1
    for nil != p && j < i {
        p = p.Next
        j++
    }
    if nil == p || j > i {
        fmt.Println("pls check i:",i)
        return false
    }
    s := &LinkNode{Data: e}
    s.Next = p.Next
    p.Next = s
    return true
}

//遍历链表
func (head *LinkNode) Traverse() {
    point := head.Next
    for nil != point {
        fmt.Println(point.Data)
        point = point.Next
    }
    fmt.Println("--------done----------")
}

//删除链表中第i个节点,复杂度为o(n)
func (head *LinkNode) Delete(i int) bool  {
    p := head
    j := 1
    for (nil != p && j < i) {
        p = p.Next
        j++
    }
    if nil == p || j > i {
        fmt.Println("pls check i:",i)
        return false
    }

    p.Next = p.Next.Next
    return true
}

// 获取链表中的第i个元素,复杂度为o(n)
func (head *LinkNode) Get(i int) Elem  {
    p := head.Next
    for j:= 1; j< i ;j++  {
        if nil == p {
            //表示返回错误
            return -100001
        }
        p=p.Next
    }

    return p.Data
}

func main() {
    linkedList := New()
    linkedList.Insert(1,9)
    linkedList.Insert(1,99)
    linkedList.Insert(1,999)
    linkedList.Insert(1,9999)
    linkedList.Insert(1,99999)
    linkedList.Insert(1,999999)
    linkedList.Traverse()

    linkedList.Delete(4)
    linkedList.Traverse()


    e := linkedList.Get(4)
    fmt.Println(e)
}
原文链接:/go/187665.html

猜你在找的Go相关文章