用golang实现的单向链表

用golang实现的单向链表,第1张

概述复习一下数据结构,用golang来实现单向链表 package mainimport "fmt"type Object interface{}type Node struct { Data Object next *Node}type List struct { size uint64 head *Node tail *Node}fu 复习一下数据结构,用golang来实现单向链表

package mainimport "fmt"type Object interface{}type Node struct {    Data Object    next *Node}type List struct {    size uint64    head *Node    tail *Node}func (List *List) Init() {    (*List).size = 0    (*List).head = nil    (*List).tail = nil}// 向链表追加节点func (List *List) Append(node *Node) bool {    if node == nil {        return false    }    (*node).next = nil // 新加节点在末尾,没有next    if (*List).size == 0 {        (*List).head = node    } else {        oldTail := (*List).tail // 取尾结点        (*oldTail).next = node  // 尾结点的next指向新加节点    }    (*List).tail = node // 新节点是尾结点    (*List).size++    return true}// 向第i个节点处插入节点func (List *List) Insert(i uint64,node *Node) bool {    if node == nil || i > (*List).size || (*List).size == 0 {        return false    }    if i == 0 {        (*node).next = (*List).head        (*List).head = node    } else {        preNode := (*List).head        for j := uint64(1); j < i; j++ {            preNode = (*preNode).next        }        (*node).next = (*preNode).next // 新节点指向旧节点原来所指的next        (*preNode).next = node         // 原节点的next指向新节点    }    (*List).size++    return true}// 移除指定位置的节点func (List *List) Remove(i uint64) bool {    if i >= (*List).size {        return false    }    if i == 0 {        prehead := (*List).head     // 取出旧的链表头        (*List).head = prehead.next // 旧链表头的next变为新的头        // 如果仅有一个节点,则头尾节点清空        if (*List).size == 1 {            (*List).head = nil            (*List).tail = nil        }    } else {        preNode := (*List).head        for j := uint64(1); j < i; j++ {            preNode = (*preNode).next        }        node := (*preNode).next     // 找到当前要删除的节点        (*preNode).next = node.next // 把当前要删除节点的next赋给其父节点的next,完成后代转移        // 若删除的尾部,尾部指针需要调整        if i == ((*List).size - 1) {            (*List).tail = preNode        }    }    (*List).size--    return true}// 移除所有节点func (List *List) RemoveAll() bool {    (*List).Init()    return true}// 获取指定位置的节点func (List *List) Get(i uint64) *Node {    if i >= (*List).size {        return nil    }    node := (*List).head    for j := uint64(0); j < i; j++ {        node = (*node).next    }    return node}// 搜索某个数据的节点位置func (List *List) IndexOf(data Object) int64 {    pos := int64(-1)    node := (*List).head    if node.Data == data {        return 0    }    for j := uint64(1); j < (*List).size; j++ {        if node != nil {            node = (*node).next            if node != nil && node.Data == data {                pos = int64(j)                break            }        }    }    return pos}// 取得链表长度func (List *List) GetSize() uint64 {    return (*List).size}// 取得链表头func (List *List) Gethead() *Node {    return (*List).head}// 取得链表尾func (List *List) GetTail() *Node {    return (*List).tail}func main() {    var l List    l.Init()    node1 := &Node{Data: 11111}    l.Append(node1)    node2 := &Node{Data: 22222}    l.Append(node2)    node3 := &Node{Data: 33333}    l.Append(node3)    node4 := &Node{Data: "insert"}    l.Insert(1,node4)    node5 := &Node{Data: "head"}    l.Insert(0,node5)    node6 := &Node{Data: "tail"}    l.Append(node6)    l.Remove(0)    l.Remove(1)    l.Remove(3)    pos1 := l.IndexOf(22222)    pos2 := l.IndexOf(44444)    fmt.Println(pos1,pos2)    fmt.Println(l.Gethead(),l.GetTail(),l.GetSize())    fmt.Println()    //l.RemoveAll()    for i := uint64(0); i < l.size; i++ {        fmt.Println(l.Get(i))    }}
总结

以上是内存溢出为你收集整理的用golang实现的单向链表全部内容,希望文章能够帮你解决用golang实现的单向链表所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1265675.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-08
下一篇 2022-06-08

发表评论

登录后才能评论

评论列表(0条)

保存