数据结构【Golang实现】(一)——单链表
创始人
2024-06-03 01:42:02

目录

  • 1. 定义节点
  • 2. IsEmpty():
  • 3. Length():
  • 4. AddFromHead():
  • 5. AddFromTail():
  • 6. Insert()
  • 7. DeleteHead()
  • 8. DeleteTail()
  • 9. Remove()
  • 10. Contain()
  • 11. Traverse()

1. 定义节点

// Node 定义节点
type Node struct {Data anyNext *Node
}type LinkedList struct {headNode *Node // 头指针
}

2. IsEmpty():

// IsEmpty 判断链表是否为空
func (l *LinkedList) IsEmpty() bool {if l.headNode == nil {return true}return false
}

3. Length():

// Length 向链表尾部添加结点
func (l *LinkedList) Length() int {currentNode := l.headNodeif currentNode == nil {return 0}length := 0for currentNode != nil {length++currentNode = currentNode.Next}return length
}

4. AddFromHead():

// AddFromHead 向链表尾部添加结点
func (l *LinkedList) AddFromHead(data any) {node := &Node{data, nil}if l.IsEmpty() { // 如果链表为空,设置该node为头结点即可l.headNode = nodereturn}// 将头指针指向的头结点设置为该节点的next,并将头指针指向该节点node.Next = l.headNodel.headNode = node
}

5. AddFromTail():

// AddFromTail 向链表尾部添加结点
func (l *LinkedList) AddFromTail(data any) {node := &Node{data, nil}if l.IsEmpty() == true {l.headNode = nodereturn}currentNode := l.headNodefor currentNode.Next != nil { // 直接遍历到最后一个节点currentNode = currentNode.Next}currentNode.Next = node
}

6. Insert()

// Insert 向链表中指定位置添加结点,下标0开始
func (l *LinkedList) Insert(position int, data any) {if position <= 0 { // 如果位置<=0,就直接在从头部添加l.AddFromHead(data)} else if position >= l.Length() { // 如果位置>=l.Length(),就直接在从尾部添加l.AddFromTail(data)} else { // 否则node := &Node{data, nil}preNode := l.headNodecount := 0for count != position-1 { // 循环退出以后pre刚好在position-1的位置preNode = preNode.Nextcount++}node.Next = preNode.NextpreNode.Next = node}
}

7. DeleteHead()

// DeleteHead 删除头部
func (l *LinkedList) DeleteHead() any {if l.IsEmpty() {fmt.Println("LinkedList is empty")return nil}head := l.headNodel.headNode = l.headNode.Nextreturn head
}

8. DeleteTail()

// DeleteTail 删除尾部节点
func (l *LinkedList) DeleteTail() any {if l.IsEmpty() {fmt.Println("LinkedList is empty")return nil}currentNode := l.headNodefor currentNode.Next.Next != nil { //如果下下个节点为nil,说明下个节点是最后一个节点currentNode = currentNode.Next}data := currentNode.Next.DatacurrentNode.Next = nil // 删除最后一个节点return data
}

9. Remove()

// Remove 删除指定节点
func (l *LinkedList) Remove(data any) {if l.IsEmpty() {return}currentNode := l.headNodeif currentNode.Data == data {l.headNode = currentNode.Next} else {for currentNode.Next != nil { // 遍历到倒数第二个节点if currentNode.Next.Data == data { // 用下一个节点去比较(保证尾结点不被漏掉),头结点在上面已经比较过了currentNode.Next = currentNode.Next.Next} else {currentNode = currentNode.Next}}}
}

10. Contain()

// Contain 链表中是否包含某个值的节点
func (l *LinkedList) Contain(data any) bool {if l.IsEmpty() {return false}currentNode := l.headNodeif currentNode.Data == data {return true}for currentNode != nil {if currentNode.Data == data {return true}currentNode = currentNode.Next}return false
}

11. Traverse()

// Traverse 遍历单链表
func (l *LinkedList) Traverse() {if l.IsEmpty() {fmt.Println("LinkedList is empty")return}currentNode := l.headNodefor currentNode != nil {fmt.Printf("%v -> ", currentNode.Data)currentNode = currentNode.Next}
}

相关内容

热门资讯

宁波精达(603088.SH)... 格隆汇12月18日丨宁波精达(603088.SH)公布,公司于2025年12月18日收到股东郑功出具...
传壁仞科技拟圣诞节前启动港股I... 观点网讯:12月18日,国产GPU企业壁仞科技计划于圣诞节前启动港股IPO程序,拟集资5亿至6亿美元...
黑牡丹(600510.SH)子... 黑牡丹(600510.SH)发布公告,近日,公司全资子公司常州黑牡丹置业有限公司以总价 6.77亿元...
豆包大模型联合润欣科技、老凤祥...   炒股就看金麒麟分析师研报,权威,专业,及时,全面,助您挖掘潜力主题机会! (来源:IT之家)I...
万物云回购24万股 总金额46... 万物云(02602)发布公告,2025年12月18日,公司回购股份24万股,回购金额为461万港元。...