//链表
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为指定值的节点,但有不想对链表进入侵入,应该怎么做
golang删除链表中指定值的节点
- 写回答
- 好问题 0 提建议
- 关注问题
- 邀请回答
-
3条回答 默认 最新
关注让阿豪来帮你解答,本回答参考chatgpt3.5编写提供,如果还有疑问可以评论或留言
为了实现删除链表中client_id为指定值的节点,但又不想对链表进行侵入,我们可以通过遍历链表,找到需要删除的节点并将其前一个节点指向其后一个节点,达到删除节点的效果。具体步骤如下:- 创建一个公共方法,例如DeleteNode,接收client_id作为参数。
- 在DeleteNode方法内部,遍历链表,找到需要删除的节点的前一个节点。
- 在找到节点的前一个节点后,将该节点的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指向需要删除的节点的下一个节点,最终实现删除操作。这样可以避免直接对链表进行操作,保持链表的封装性。
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报