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

相关内容

热门资讯

晶品特装股价跌5.15%,富安... 7月4日,晶品特装跌5.15%,截至发稿,报88.21元/股,成交4139.34万元,换手率1.31...
昂利康跌2.05%,成交额62... 7月4日,昂利康盘中下跌2.05%,截至09:35,报44.00元/股,成交6228.37万元,换手...
香农芯创跌2.76%,成交额6... 7月4日,香农芯创盘中下跌2.76%,截至09:35,报34.90元/股,成交6654.20万元,换...
中科磁业7月3日获融资买入81... 7月3日,中科磁业涨0.49%,成交额7.64亿元。两融数据显示,当日中科磁业获融资买入额8124....
颀中科技7月3日获融资买入49... 7月3日,颀中科技涨0.00%,成交额4526.54万元。两融数据显示,当日颀中科技获融资买入额49...
万达轴承7月3日获融资买入59... 7月3日,万达轴承跌1.64%,成交额1.43亿元。两融数据显示,当日万达轴承获融资买入额597.6...
小方制药7月3日获融资买入21... 7月3日,小方制药涨4.46%,成交额2.10亿元。两融数据显示,当日小方制药获融资买入额2166....
齐鲁粮油兰州推介会暨产业合作洽... 齐鲁粮油兰州推介会暨产业合作洽谈会成功举办每日甘肃网7月4日讯 据兰州日报报道 7月3日,“齐鲁粮油...
万辰集团7月3日获融资买入34... 7月3日,万辰集团跌2.65%,成交额6.15亿元。两融数据显示,当日万辰集团获融资买入额3413....
睿昂基因7月3日获融资买入23... 7月3日,睿昂基因跌0.85%,成交额2433.71万元。两融数据显示,当日睿昂基因获融资买入额23...