• 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)
    }
  • 相关阅读:
    vue刷新出现花括号处理方式
    数据库更新数据未成功返回更新条数问题
    多测师拱墅校区肖sir_高级金牌讲师_app自动化搭建环境(2)
    肖sir__高级讲师___讲解app接口测试
    多测师拱墅校区肖sir_高级金牌讲师_app测试mokey测试
    多测师拱墅校区肖sir_高级金牌讲师_app运用(3)
    肖sir__高级讲师___app 面试题
    多测师拱墅校区肖sir_高级金牌讲师_app定位元素(4)
    多测师拱墅校区肖sir_高级金牌讲师_app测试(1)
    多测师拱墅校区肖sir_高级金牌讲师_jenkins
  • 原文地址:https://www.cnblogs.com/wuchangblog/p/16705280.html
Copyright © 2020-2023  润新知