189 8069 5689

golang实现单向链表的方法-创新互联

单向链表

奉新ssl适用于网站、小程序/APP、API接口等需要进行数据传输应用场景,ssl证书未来市场广阔!成为成都创新互联公司的ssl证书销售渠道,可以享受市场价格4-6折优惠!如果有意向欢迎电话联系或者加微信:18980820575(备注:SSL证书合作)期待与您的合作!

单向链表(单链表)是链表的一种,其特点是链表的链接方向是单向的,对链表的访问要通过顺序读取从头部开始;链表是使用指针进行构造的列表;又称为结点列表,因为链表是由一个个结点组装起来的;其中每个结点都有指针成员变量指向列表中的下一个结点;

特点:

(1)单个结点创建非常方便,普通的线性内存通常在创建的时候就需要设定数据的大小

(2)结点的删除非常方便,不需要像线性结构那样移动剩下的数据

(3)结点的访问方便,可以通过循环或者递归的方法访问到任意数据,但是平均的访问效率低于线性表

golang实现单向链表的方法

package main import (    "fmt" ) type LinkNode struct {    Data interface{}    Next *LinkNode } type SingleLink struct {    head *LinkNode    tail *LinkNode    size int } // 初始化链表 func InitSingleLink()(*SingleLink){    return &SingleLink{       head:nil,       tail:nil,       size:0,    } } // 获取头部节点 func (sl *SingleLink)GetHead()*LinkNode{    return  sl.head } // 获取尾部节点 func (sl *SingleLink)GetTail()*LinkNode{    return  sl.tail } // 打印链表 func (sl *SingleLink) Print(){    fmt.Println("SingleLink size:",sl.Length())    if sl.size == 0{       return    }    ptr := sl.GetHead()    for ptr != nil{       fmt.Println("Data:",ptr.Data)       ptr = ptr.Next    } } //链表长度 func (sl *SingleLink) Length() int{    return sl.size } //插入数据(头插) func (sl *SingleLink) InsertByHead(node *LinkNode){    if node == nil{       return    }    // 判断是否第一个节点    if sl.Length() == 0{       sl.head = node       sl.tail = node       node.Next = nil    }else{       oldHeadNode := sl.GetHead()       sl.head = node       sl.head.Next = oldHeadNode    }    sl.size++ } //插入数据(尾插) func (sl *SingleLink) InsertByTail(node *LinkNode) {    if node == nil{       return    }    // 插入第一个节点    if sl.size == 0{       sl.head = node       sl.tail = node       node.Next = nil    }else{       sl.tail.Next = node       node.Next = nil       sl.tail = node    }    sl.size ++ } //插入数据(下标)位置 func (sl *SingleLink) InsertByIndex(index int, node *LinkNode){    if node == nil{       return    }    // 往头部插入    if index == 0 {       sl.InsertByHead(node)    }else{       if index > sl.Length(){          return       }else if index == sl.Length(){          //往尾部添加节点          sl.InsertByTail(node)       }else{          preNode := sl.Search(index-1)     // 下标为 index 的上一个节点          currentNode := sl.Search(index)       // 下标为 index 的节点          preNode.Next = node          node.Next = currentNode          sl.size++       }    } } //删除数据(下标)位置 func (sl *SingleLink) DeleteByIndex(index int) {    if sl.Length() == 0 || index > sl.Length(){       return    }    // 删除第一个节点    if index == 0{       sl.head = sl.head.Next    }else{       preNode := sl.Search(index-1)       if index != sl.Length()-1{          nextNode := sl.Search(index).Next          preNode.Next = nextNode       }else{          sl.tail = preNode          preNode.Next = nil       }    }    sl.size-- } // 删除数据(数据) func (sl *SingleLink) DeleteByData(Data interface{}) {    if sl.Length() == 0 || Data == nil{       return    }    node := sl.head    preNode := sl.head    for node.Next != nil{       preNode = node       node = node.Next       if node.Data.(int) == Data.(int){          preNode.Next = node.Next          node.Next = nil          node.Data = nil          node = nil          return       }    } } // 查询数据 func (sl *SingleLink) Search(index int)(node *LinkNode)  {    if     sl.Length() == 0 || index > sl.Length(){       return nil    }    // 是否头部节点    if index == 0{       return sl.GetHead()    }    node = sl.head    for i:=0;i<=index;i++{       node = node.Next    }    return } //销毁链表 func (sl *SingleLink) Destroy() {    sl.tail = nil    sl.head = nil    sl.size = 0 } func main() {    // 初始化链表    sl := InitSingleLink()    // 指定指标插入    for i:=0;i<5;i++{       snode := &LinkNode{          Data:i,       }       sl.InsertByIndex(i,snode)    }    sl.Print()    fmt.Println("===============================")    var snode *LinkNode    // 往头部插入节点    snode = &LinkNode{       Data:6,    }    sl.InsertByHead(snode)    sl.Print()    fmt.Println("===============================")    //往尾部插入节点    snode = &LinkNode{       Data:5,    }    sl.InsertByTail(snode)    sl.Print()    fmt.Println("===============================")    // 查询下标为2的节点    node := sl.Search(2)    fmt.Println("Node2:",node.Data)    fmt.Println("===============================")    // 删除下标为2的节点    sl.DeleteByIndex(2)    sl.Print()    fmt.Println("===============================")    // 删除Data 为3的节点    sl.DeleteByData(3)    sl.Print() }

另外有需要云服务器可以了解下创新互联cdcxhl.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


文章名称:golang实现单向链表的方法-创新互联
浏览地址:http://cdxtjz.cn/article/dopphc.html

其他资讯