首页 > 其他分享 >Go 单向环形链表

Go 单向环形链表

时间:2022-09-18 17:34:59浏览次数:95  
标签:head temp No CatNode 单向 Next 链表 Go

单向环形链表

单向环形链表是一种特殊的单向链表。

单向链表最后一个节点的 Next 指针指向空。

而单向环形链表最后一个节点的 Next 指针指向头节点。

如图所示:

 

package main

import "fmt"

type CatNode struct {
    No   int
    Name string
    Next *CatNode
}

func AddCartNode(head *CatNode, newCatNode *CatNode) {
    // 判断是不是添加第一只猫
    if head.Next == nil {
        head.No = newCatNode.No
        head.Name = newCatNode.Name
        head.Next = head
    } else {
        // 定义一个临时变量,帮忙,找到环形的最后结点
        temp := head
        for {
            if temp.Next == head {
                break
            }
            temp = temp.Next
        }
        // 加入到链表中
        newCatNode.Next = head
        temp.Next = newCatNode
    }
    fmt.Println("添加成功")
}

//输出这个环形的链表
func ListCircleLink(head *CatNode) {
    temp := head
    if temp.Next == nil {
        fmt.Println("环形单链表空空如也...")
        return
    }
    fmt.Println("环形单链表打印:")
    fmt.Printf("\t")
    for {
        fmt.Printf("[No: %d Name: %s]->", temp.No, temp.Name)
        if temp.Next == head {
            break
        }
        temp = temp.Next
    }
    fmt.Println()
}

// 删除一只猫
func DelCatNode(head *CatNode, no int) *CatNode {
    temp := head
    // 定义环形链表尾部
    rear := head
    // 空链表
    if head.Next == nil {
        fmt.Println("环形单链表, 不能删除...")
        return head
    }
    // 如果只有一个结点
    if temp.Next == head && temp.No == no {
        temp.Next = nil
        return head
    }
    // 将rear定位到链表最后
    for {
        if rear.Next == head {
            break
        }
        rear = rear.Next
    }

    // 如果有两个包含两个以上结点
    flag := true
    for {
        // 如果到这来,说明我比较到最后一个【最后一个还没比较】
        if temp.Next == head {
            break
        }
        if temp.No == no {
            //说明删除的是头结点
            if temp == head {
                head = head.Next
            }
            //恭喜找到., 我们也可以在直接删除
            rear.Next = temp.Next
            fmt.Println("删除结点:")
            fmt.Printf("\t[No: %d Name: %s]\n", temp.No, temp.Name)
            flag = false
            break
        }
        // 位移, 比较<temp.No == no>
        temp = temp.Next
        // 移动 <一旦找到要删除的结点 rear>
        rear = rear.Next
    }

    // 这里还有比较一次
    if flag {
        //如果flag 为真, 则我们上面没有删除, 判断是不是删除头结点
        if temp.No == no {
            rear.Next = temp.Next
        } else {
            fmt.Printf("没有此结点[No=%d]...\n", no)
        }
    }
    return head
}

func main() {
    head := &CatNode{}
    cat1 := &CatNode{No: 1, Name: "tom1"}
    cat2 := &CatNode{No: 2, Name: "tom2"}
    cat3 := &CatNode{No: 3, Name: "tom3"}
    AddCartNode(head, cat1)
    ListCircleLink(head)
    AddCartNode(head, cat3)
    ListCircleLink(head)
    AddCartNode(head, cat2)
    ListCircleLink(head)

    head = DelCatNode(head, 3)
    ListCircleLink(head)

    head = DelCatNode(head, 4)
    ListCircleLink(head)
}

标签:head,temp,No,CatNode,单向,Next,链表,Go
From: https://www.cnblogs.com/wuchangblog/p/16705280.html

相关文章

  • Go 学习(一) : Get started with Go
    安装gohttps://go.dev/doc/install安装以后命令行执行goversion然后随便创建一个文件,比如hello.gopackagemainimport"fmt"funcmain(){ fmt.Printl......
  • Go 单链表2
    插入节点1)、头插法packagemainimport"fmt"typeNodestruct{dataintnext*Node}funcShownode(p*Node){//遍历forp!=nil{fm......
  • 使用pymongo管理MongoDB
    基于pymongo的MongoDB系列操作,会不定时补充更新frompymongoimportMongoClientimportpymongoimportdatetime##连接本地MongoDBclient=MongoClient("mongodb:......
  • golang air 热部署
    1、安装在这里就介绍大众使用的两个版本MacOS和Windows;(建议使用第一种)//1.16可以同时使用这两种方法goget-ugithub.com/cosmtrek/air//1.16......
  • 力扣206(java&python)-反转链表(简单)
    题目:给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。示例1:输入:head=[1,2,3,4,5]输出:[5,4,3,2,1]示例2:输入:head=[1,2]输出:[2,1]示例3:输入:head=......
  • 链表二
    继上次的链表一,已经熟悉了链表大致的结构,这篇则是讲基本链表的最终形态首先来确定一下需要学习链表的哪些东西:添加、打印、寻找、删除和清除voidadd(List*pList,in......
  • 关于朋友圈出现的小米新店广告骗局(非法获取个人消息)木马通过广东政务服务网(tyrz.gd.g
     前两天在朋友圈突然看到有发小米新店开业送千台扫地机器人的广告,出于天上不会掉馅饼到我身上的原则我选择忽略了,但是没多久看到他又晒了个物流订单,于是还是点开看......
  • go-cqhttp调用接口
    目录调用接口一、概述1、简介2、接口二、接入权限系统1、智能聊天2、戳一戳3、新成员三、调用接口1、查找接口2、调用接口3、接入机器人调用接口一、概述1......
  • 第六章 MongoDB数据库开发
    FireDAC也在DX10的版本中开始加入支持NoSQL型态的数据库,并选择其中最为流行的MongoDB为第1个支持的目标。MongoDB的数据体结构是以 (Key,Value)组合的,储存的方式是使......
  • Go-数组模拟队列(环形列表)
      复制packagemainimport( "errors" "fmt" "os")typeCircleQueuestruct{ maxSizeint array[5]int headint tailint}//添加队列fu......