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

相关内容

热门资讯

中证A500ETF摩根(560... 8月22日,截止午间收盘,中证A500ETF摩根(560530)涨1.19%,报1.106元,成交额...
A500ETF易方达(1593... 8月22日,截止午间收盘,A500ETF易方达(159361)涨1.28%,报1.104元,成交额1...
何小鹏斥资约2.5亿港元增持小... 每经记者|孙磊    每经编辑|裴健如 8月21日晚间,小鹏汽车发布公告称,公司联...
中证500ETF基金(1593... 8月22日,截止午间收盘,中证500ETF基金(159337)涨0.94%,报1.509元,成交额2...
中证A500ETF华安(159... 8月22日,截止午间收盘,中证A500ETF华安(159359)涨1.15%,报1.139元,成交额...
科创AIETF(588790)... 8月22日,截止午间收盘,科创AIETF(588790)涨4.83%,报0.760元,成交额6.98...
创业板50ETF嘉实(1593... 8月22日,截止午间收盘,创业板50ETF嘉实(159373)涨2.61%,报1.296元,成交额1...
港股异动丨航空股大幅走低 中国... 港股航空股大幅下跌,其中,中国国航跌近7%表现最弱,中国东方航空跌近5%,中国南方航空跌超3%,美兰...
电网设备ETF(159326)... 8月22日,截止午间收盘,电网设备ETF(159326)跌0.25%,报1.198元,成交额409....
红利ETF国企(530880)... 8月22日,截止午间收盘,红利ETF国企(530880)跌0.67%,报1.034元,成交额29.0...