golang数据结构之循环链表

循环链表还是挺有难度的:

  • 向链表中插入第一条数据的时候如何进行初始化。
  • 删除循环链表中的数据时要考虑多种情况。

详情在代码中一一说明。

目录结构如下:

circleLink.go

package link

import (
    "fmt"
)

type CatNode struct {
    ID   int
    Name string
    next *CatNode
}

func InserCatNode(head *CatNode,newCatNode *CatNode) {
    //初始化链表
    头结点一开始是空的,当插入第一条数据时,进行初始化
    if head.next == nil {
        head.ID = newCatNode.ID
        head.Name = newCatNode.Name
        head.next = head
        return
    }
    定义一个临时变量,找到环形的末尾,方便以后进行插入
    tmp := head
    for {
        if tmp.next == head {
            tmp.next = newCatNode
            newCatNode.next = head
            break
        } else {
            tmp = tmp.next
        }
    }
}

func DeleteCatNode(head *CatNode,id int) *CatNode {
    建立一个节点指向头结点
    tmp :=如果头结点.next为空,说明是空链表
     nil {
        fmt.Println(空链表)
         head
    }
    如果头结点.next就是它自己,说明只有一个元素
     head {
        判断该元素是否是要删除的,如果是,则将头结点置为空
        if tmp.ID == id {
            head.next = nil
             head
        }  {
            fmt.Println(要删除的id不存在)
        }
    }
    奖励一个辅助指针指向头结点
    helper :=如果头结点正好是我们要删除的
     id {
        fmt.Println(进入1如果头结点.next不是指向它自己,说明除了头结点之外还存在其它节点
        if tmp.next != head {
            fmt.Println(进入2)
            此时若想删除头结点,我们必须获得一个新的头结点
            tmp = head.next
            将helper遍历到头结点的前一位
             {
                if helper.next != head {
                    helper = helper.next
                }  {
                    同时删除掉原来的头结点
                    fmt.Println(进入3)
                    helper.next = head.next
                     tmp
                }
            }
        }  {
            说明只有一个头结点,且是我们要删除的,直接将其置为空
            tmp.next = nil
        }
        如果头结点不是我们要删除的
    } 如果找到一个节点是我们要删除的
            if tmp.next.ID == id {
                删除该节点
                tmp2 := tmp.next
                tmp.next = tmp2.next
                break
                如果找不到则继续遍历下一个节点
            }  {
                tmp = tmp.next
                如果下一个节点是头结点,则表明完成遍历,找不到要删除的节点,并退出
                 head {
                    fmt.Println(未找到该条记录)
                    
                }
            }
        }
    }

     head
}

func ListCatNode(head *CatNode) {
    tmp :=空环形链表 {
        fmt.Printf(猫的信息为:id=%d,name=%s\n,tmp.ID,tmp.Name)
         head {
             tmp.next
        }

    }

}

main.go

package main

import (
    "
    go_code/data_structure/link
)

func main() {

    head := &link.CatNode{}
    cat1 := &link.CatNode{
        ID:   1tom2jack3bob4mike------------------------------)
    fmt.Println(删除id=1后的结果是:)
    h1 := link.DeleteCatNode(head,)
    link.ListCatNode(h1)
    fmt.Println(删除id=4后的结果是:)
    h2 := link.DeleteCatNode(h1,1)">)
    link.ListCatNode(h2)
    fmt.Println(删除id=3后的结果是:)
    h3 := link.DeleteCatNode(h2,1)">)
    link.ListCatNode(h3)
    fmt.Println(删除id=2后的结果是:)
    h4 := link.DeleteCatNode(h3,1)">)
    link.ListCatNode(h4)
}

运行结果:

 

 

相关文章

类型转换 1、int转string 2、string转int 3、string转float ...
package main import s "strings" import...
类使用:实现一个people中有一个sayhi的方法调用功能,代码如...
html代码: beego代码:
1、读取文件信息: 2、读取文件夹下的所有文件: 3、写入文件...
配置环境:Windows7+推荐IDE:LiteIDEGO下载地址:http:...