【数据结构】Go语言操作单链表

117 阅读3分钟

「这是我参与2022首次更文挑战的第23天,活动详情查看:2022首次更文挑战」。

  • 创建节点
type Node struct {
   value interface{}
   pNext *Node
}

value 作为数值域 pNext 作为指针域

1. 创建链表

func create(arr []int) *Node {
(1)   root := new(Node)
(2)   cur := root
(3)   for i := 0; i < len(arr); i++ {
(4)      tmp := new(Node)
(5)      tmp.value = arr[i] // 构造节点
(6)      cur.pNext = tmp    // 连接上该节点
(7)      cur = cur.pNext
   }
   return root.pNext
}
  • (1) 创建根节点
  • (2) 创建cur表示当前指向的节点,类似head
  • (3) 对输入的数组进行遍历,并赋值上链
  • (4) 创建一个待插入的新节点tmp
  • (5) 给tmp进行赋值
  • (6) 将cur节点的下一个节点pNext指向tmp
  • (7) 推进cur变成cur.pNext,持续推进

演示

image.png

2. 链表插入

插在前面

func insert(list *Node,dest,data int) *Node {
   for list.pNext != nil {
(0)      if list.pNext.value == dest {
(1)         dataNode := new(Node)
(2)         dataNode.value = data
(3)         tmp := list.pNext
(4)         list.pNext = dataNode
(5)         dataNode.pNext = tmp
(6)         break
      }
(7)      list = list.pNext
   }
   return list
}
  • (0) 如果下一个值是目标值的话,就进行插入操作
  • (1) 新建一个Node对象dataNode
  • (2) 对新建的Node对象dataNode进行赋值操作
  • (3) 用一个tmp暂存list.pNext,因为当list进行pNext赋值之后(插入值)就会发生改变
  • (4) 将此时的list的pNext指向新建里的dataNode
  • (5) dataNode的下一个,接到原本的list.pNext上,也就是tmp的值
  • (6) 插入完毕后直接break。
  • (7) 推进list变成list.pNext,持续推进

演示

image.png

3. 链表更新

func update(list *Node, dest, data int) *Node {
(1)   pre := list
(2)   for list.pNext != nil {
(3)      if list.pNext.value == dest {
(4)         dataNode := new(Node)
(5)         dataNode.value = data
(6)         tmp := list.pNext
(7)         list.pNext = dataNode
(8)         dataNode.pNext = tmp.pNext
(9)         break
      }
(10)      list = list.pNext
   }
   return pre
}
  • (1) 先对list进行备份赋值
  • (2) 当下一个不是节点不是nil的时候
  • (3) 当找到这个目标值之后
  • (4) 新建一个Node对象dataNode
  • (5) 并对这个dataNode进行赋值操作
  • (6) 先暂时存在list.pNext,因为插入之后list.pNext就变了,不再是原来的那个了
  • (7) 让list的next等于dataNode
  • (8) 然后给这个dataNode接上原来的list的next
  • (9) 更新操作完成了,就可以跳出来了
  • (10) list不断向前

演示

image.png

4. 链表删除

func delete(list *Node, dest int) *Node  {
(1)   pre := list
(2)   for list.pNext.value!=dest {
(3)      list = list.pNext
      }
(4)   list.pNext = list.pNext.pNext
(5)   return pre
}
  • (1) 先对list进行备份赋值
  • (2) 当下一个不是目标值的时候
  • (3) list=list.pNext 一直推送下去
  • (4) 当找到这个值之后,直接跳过下一个节点,让list.pNext直接等于list的下两个
  • (5) 返回list的备份赋值pre

演示

image.png

5. 链表反转

func reverse(list *Node) *Node {
(1)   pre := new(Node)
(2)   cur := list
(3)   for cur!=nil {
(4)      curNext := cur.pNext
(5)      cur.pNext = pre
(6)      pre = cur
(7)      cur = curNext
   }
   return pre
}
  • (1) 新建一个pre当作新链表的root
  • (2) 新起一个变量cur当作list的head,当前指向
  • (3) 如果cur不是nil的话就一直遍历下去
  • (4) curNext将会暂存cur的pNext的值
  • (5) 让cur.pNext赋pre的值,类似于后一个的等于前一个的值
  • (6) 让pre等于cur,推前
  • (7) 让cur等于curNext,推前

演示

image.png