「这是我参与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,持续推进
演示
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,持续推进
演示
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不断向前
演示
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
演示
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,推前
演示