showliuzp 2025-10-18 16:20 采纳率: 84.3%
浏览 2
已结题

golang删除链表中指定值的节点

//链表
import (
    "sync"
    "fmt"
    )

//并发安全单链表
type SingleNode struct {
    Data interface{}
    Next *SingleNode
}

type SingleList struct {
    mutex *sync.RWMutex //读写锁

    Head  *SingleNode   //头节点
    Tail  *SingleNode   //尾节点

    Size  uint          //总数
}

func NewList() *SingleList {
    return &SingleList{
        Size:  0,
        Head:  nil,
        Tail:  nil,
        mutex: new(sync.RWMutex),
    }
}

//后插元素
func (List *SingleList) LastAppend(node *SingleNode) bool {
    if node == nil {
        return false
    }

    List.mutex.Lock()

    defer List.mutex.Unlock()

    if List.Size == 0 {
        List.Head = node
        List.Tail = node
        List.Size = 1
        return true
    }

    tail := List.Tail
    tail.Next = node
    List.Tail = node
    List.Size += 1

    return true
}

//删除链表中的节点
func (List *SingleList) LastAppend(node *SingleNode) bool {
}

//链表使用
    //建立账号和连接的绑定关系,并作为链表的一个节点
    item := ChatWebSocketConn{
        user_conn       : tools.WebSocketConnMapOnce.ConnMap[client_id],
        client_id          :   *client_id,
        user_type       : (*user_info).Flag,
        user_id         : (*user_info).Id,
        user_nickname   : (*user_info).NickName,
    }

    linked_node := tools.SingleNode{Data:item}
    linked_list.LastAppend(&linked_node)

//ChatWebSocketConn定义
type ChatWebSocketConn struct{
    user_conn       *tools.WebSocketConn            //已建立的客户端连接,lu_guild_account_list表id
    client_id       string                          //生成的唯一id,标识一个客户端
    user_type       int                             //用户类型,1:会员 2:主播
    user_id         int64                           //用户id
    user_nickname   string                          //用户昵称
}


我想写个函数,删除链表中client_id为指定值的节点,但有不想对链表进入侵入,应该怎么做
  • 写回答

3条回答 默认 最新

  • 码农阿豪@新空间 新星创作者: 前端开发技术领域 2025-10-18 16:55
    关注
    让阿豪来帮你解答,本回答参考chatgpt3.5编写提供,如果还有疑问可以评论或留言
    为了实现删除链表中client_id为指定值的节点,但又不想对链表进行侵入,我们可以通过遍历链表,找到需要删除的节点并将其前一个节点指向其后一个节点,达到删除节点的效果。具体步骤如下:
    1. 创建一个公共方法,例如DeleteNode,接收client_id作为参数。
    2. 在DeleteNode方法内部,遍历链表,找到需要删除的节点的前一个节点。
    3. 在找到节点的前一个节点后,将该节点的Next指向需要删除的节点的下一个节点即可实现删除操作。 下面是一个示例代码:
    // 删除链表中的指定值节点
    func (List *SingleList) DeleteNode(client_id string) bool {
        if List.Size == 0 {
            return false
        }
        List.mutex.Lock()
        defer List.mutex.Unlock()
        
        var prev *SingleNode = nil
        current := List.Head
        for current != nil {
            conn, ok := current.Data.(ChatWebSocketConn)
            if ok && conn.client_id == client_id {
                if prev == nil {
                    List.Head = current.Next
                } else {
                    prev.Next = current.Next
                }
                List.Size--
                if List.Size == 0 {
                    List.Tail = nil
                }
                return true
            }
            prev = current
            current = current.Next
        }
        return false
    }
    

    在这个示例代码中,我们定义了一个DeleteNode方法,用于删除链表中client_id为指定值的节点。通过遍历链表,找到需要删除的节点的前一个节点,然后将其Next指向需要删除的节点的下一个节点,最终实现删除操作。这样可以避免直接对链表进行操作,保持链表的封装性。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 10月26日
  • 已采纳回答 10月18日
  • 创建了问题 10月18日