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

目录

  • 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}
}

相关内容

热门资讯

摸摸你的腰mp3 摸摸你的腰mp3摸摸你的腰mp3... 摸摸你的腰mp3 展开 好多水我摸摸你的头好温柔,我...
最近书荒啊,谁有没有好看的言情... 最近书荒啊,谁有没有好看的言情小说介绍一些啊!不配【有三部】,赶夫上轿【轻松】,南风过境【宠文】,花...
金饰克价再次涨至1000元!黄... 本文来自微信公众号“大象新闻”6月30日,现货黄金盘中一度跌至一个月内新低,随后开始大幅反弹,收报3...
西安警方回应“中华田园犬禁养”... 6月30日,网传陕西省西安市公安局限制养犬管理办公室发布的“重点限养区禁止饲养烈性犬和大型犬”图片引...
小学生常常以教师的行为为榜样,... 小学生常常以教师的行为为榜样,教师也处处表现出对表现好的学生的喜爱和认可,学生从中获得派生地位。这种...
香港维持对日本水产进口管制 作者 | 《财经》特派香港记者 焦建 编辑 | 苏琦  日本水产及日式料理多年来受港人追捧,日本水产...
成都先导终止收购海纳医药65%... 6月30日,成都先导药物开发股份有限公司(以下简称“成都先导”)宣布,因未能就交易事项的核心条款达成...
11岁女孩身高137cm,警惕...   炒股就看金麒麟分析师研报,权威,专业,及时,全面,助您挖掘潜力主题机会! 转自:医学界*仅供医...
《勇气》阅读题理解 《勇气》阅读题理解 19世纪,在英国的名门公立学校—哈罗学校常常会出现以强凌弱、以大欺小的事情。...
建设银行再创历史新高!牵手“山...   炒股就看金麒麟分析师研报,权威,专业,及时,全面,助您挖掘潜力主题机会!   中国基金报记者 ...