golang实现循环单链代码示例
package mainimport "fmt"//定义节点的数据结构type Node struct {data interface{}next *Node}//单链的数据结构type OneCycleList struct {size inthead *Node}//获取链表的头部func (o *OneCycleList) GetHead() *Node {return o.head}//获取长度func (o *OneCycleList) GetSize() int {return o.size}//获取节点装的数据func (o *Node) GetData() interface{} {return o.data}//获取下一个节点的地址func (o *Node) GetNext() *Node {return o.next}//添加链表数据func (o *OneCycleList) Append(data interface{}) bool {node := Node{}//添加data数据node.data = dataif o.GetSize() == 0 {o.head = &node} else {item := o.GetHead()//找到链表尾部,当当前的这个链表的头部 == next下一个链表地址的时候//循环链表的最后一个next指向第一个的head 是相等的for ; item.next != o.GetHead(); item = item.next {}//这里是把数据挂到链表的nextitem.next = &node}node.next = o.heado.size++return true}//基于某个node进行,插入节点数据func (o *OneCycleList) InsertNext(elment *Node, data interface{}) bool {if elment == nil {return false}//处理新节点数据装载到链表中node := Node{}node.data = datanode.next = elment.nextelment.next = &nodeo.size++return true}//删除某个节点的数据,并返回该数据func (o *OneCycleList) Remove(elment *Node) interface{} {if elment == nil {return nil}item := o.GetHead()//找到elment的前一个节点for ; item.next != elment; item = item.next {}//将elment的前面一个节点的next指向当前elment的next,这里就删除了当前的节点elment了item.next = elment.nexto.size--return elment.GetData()}//调整所有的节点进行转向func Reverse(head *Node, o *OneCycleList) *OneCycleList {if head.next == o.head {o.head = headreturn o}p := Reverse(head.next, o)head.next.next = headhead.next = p.headreturn p}func main() {a := OneCycleList{}//处理好初始化a.Append(3)a.Append(4)a.Append(8)//基于3后面的节点追加数据 9a.InsertNext(a.head, 9)temp := a.headfmt.Println("下面是循环打印-------------------")//循环打印链表数据for {if temp == nil {break}fmt.Print(temp.data, "\n")if temp.next == a.head {break}temp = temp.next}//单向循环链表翻转b := Reverse(a.head, &a)fmt.Println("翻转之后打印结果-------------------")temp2 := b.headfor {if temp2 == nil {break}fmt.Print(temp2.data, "\n")if temp2.next == b.head {break}temp2 = temp2.next}fmt.Println("下面删除一个节点当前节点返回值-------------------")//下面删除一个节点fmt.Println(b.Remove(b.head.next))fmt.Println("下面删除一个节点后打印数据-------------------")temp3 := b.headfor {if temp3 == nil {break}fmt.Print(temp3.data, "\n")if temp3.next == b.head {break}temp3 = temp3.next}}
下面是循环打印-------------------3948翻转之后打印结果-------------------8493下面删除一个节点当前节点返回值-------------------4下面删除一个节点后打印数据-------------------893
推荐阅读
站长 polarisxu
自己的原创文章
不限于 Go 技术
职场和创业经验
Go语言中文网
每天为你
分享 Go 知识
Go爱好者值得关注
评论
