一.单链表基本概念

单链表是一种顺序存储的结构。 
有一个头结点,没有值域,只有连域,专门存放第一个结点的地址。 
有一个尾结点,有值域,也有链域,链域值始终为NULL。 
所以,在单链表中为找第i个结点或数据元素,必须先找到第i - 1 结点或数据元素,而且必须知道头结点,否者整个链表无法访问。

关于链表的概念,此处不细讲了,具体的内容,大家可以自行查找相关数据结构资料.

本文主要通过Golang实现链表的几种常见操作:

  1. 判断是否为空的单链表

  2. 单链表的长度

  3. 从头部添加元素

  4. 从尾部添加元素

  5. 在指定位置添加元素

  6. 删除指定元素

  7. 删除指定位置的元素

  8. 查看是否包含某个元素

  9. 遍历所有元素


二.实现代码以及代码注释

1. 定义结构体

package linkedList

import "fmt"

type Object interface{}

type Node struct {
Data Object //定义数据域
  Next *Node  //定义地址域(指向下一个表的地址)
}

type List struct {
headNode *Node //头节点
}


2.判断链表是否为空


3. 获取列表长度


func (this *List) Length() int {
//获取链表头结点
  cur := this.headNode
  //定义一个计数器,初始值为0
  count := 0

  for cur != nil {
//如果头节点不为空,则count++
     count ++
//对地址进行逐个位移
     cur = cur.Next
  }
return count
}


4.从链表头部添加元素


func (this *List) Add(data Object) *Node {
node := &Node{Data: data}
node.Next = this.headNode
  this.headNode = node
  return node
}

5. 从链表尾部添加元素


6. 在链表指定位置添加元素

7. 删除链表指定值的元素

8.删除指定位置的元素

9.查看链表是否包含某个元素

10. 遍历链表所有节点

三.测试代码与效果

  1. 创建并向链表中添加元素

测试代码:


测试结果:

2. 判断链表是否为空

测试代码:

list2 := linkedList.List{}
fmt.Printf("list 是否为空链表:%t\n", list.IsEmpty())
fmt.Printf("list2 是否为空链表:%t\n", list2.IsEmpty())

测试结果:

3. 在指定位置index=5,value=b处插入元素five_insert_value

list.Insert(5,"five_insert_value")
fmt.Print("链表List当前的数值为:")
list.ShowList()

4. 是否包含元素five_insert_value

测试代码:

isContain := list.Contain("five_insert_value")
fmt.Printf("isContain[five_insert_value]:%t",isContain)

测试结果:

isContain[five_insert_value]:true

5. 删除元素five_insert_value

测试代码:

list.Remove("five_insert_value")
fmt.Print("链表List当前的数值为:")
list.ShowList()
fmt.Println()

测试结果

链表List当前的数值为:   beforeHead 1  2  3  4  a  b  c  d



6.从位置3删除元素index=3,value=3

//注意此时的headNode是值为beforeHead的元素
list.RemoveAtIndex(3)
fmt.Print("链表List当前的数值为:")
list.ShowList()
fmt.Println()

测试结果

链表List当前的数值为:   beforeHead 1  2  4  a  b  c  d