数据结构【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}
}

相关内容

热门资讯

重大通报作弊器!乐乐上海麻将a... 重大通报作弊器!乐乐上海麻将ai智能透视辅助插件,乐乐上海麻将本来存在有外挂(有辅助挂方略)1、很好...
分享给玩家透视挂!家乡大贰ai... 分享给玩家透视挂!家乡大贰ai智能透视辅助工具,家乡大贰其实真的有外挂(有辅助挂细节)家乡大贰破解侠...
科普攻略开挂!英豪娱乐城ai智... 科普攻略开挂!英豪娱乐城ai智能透视辅助教程,英豪娱乐城好像真的是有外挂(有辅助挂头条)1、英豪娱乐...
总算了解辅助器!和悦游戏ai智... 总算了解辅助器!和悦游戏ai智能透视辅助教程,和悦游戏确实是真的有外挂(竟然有辅助挂)暗藏猫腻,小编...
揭秘关于辅助器!九九麻将ai智... 揭秘关于辅助器!九九麻将ai智能透视辅助技巧,九九麻将一贯是有外挂(有辅助挂方略)1、用户打开应用后...