链表
关于链表的原理已经有一篇链表文章写的很详细了,这篇文章主要侧重于代码的实现,主要使用go实现。
单链表实现
package List
type listNode struct {
val int
next *listNode
}
func newNode(val int) *listNode {
node := new(listNode)
node.val = val
node.next = nil
return node
}
// NewList 初始化一个不带头结点的链表
func NewList(vals []int) *listNode {
var fistNode *listNode
var curNode *listNode
for _, v := range vals {
node := newNode(v)
if curNode == nil {
fistNode = node
curNode = fistNode
continue
}
curNode.next = node
curNode = curNode.next
}
return fistNode
}
// FistAdd 头插
func FistAdd(fistNode *listNode, val int) *listNode{
if fistNode == nil {
return fistNode
}
node := newNode(val)
node.next = fistNode
return node
}
// LastAdd 尾插
func LastAdd(fistNode *listNode, val int) {
if fistNode == nil {
return
}
curNode := fistNode
for curNode.next != nil {
curNode = curNode.next
}
node := newNode(val)
curNode.next = node
return
}
// IndexValAdd 在第一个指定值后插入,若没有,在链表尾部插入
// fistNode 链表第一个节点, indexVal 目标节点值, val 新节点值
func IndexValAdd(fistNode *listNode, indexVal, val int) {
if fistNode == nil {
return
}
curNode := fistNode
for curNode.next != nil && curNode.val != indexVal {
curNode = curNode.next
}
node := newNode(val)
nextNode := curNode.next
node.next = nextNode
curNode.next = node
return
}
// ChangVal 更改目标节点值,若没有,不做改动
// fistNode 链表第一个节点, indexVal 目标节点值, val 目标值
func ChangVal (fistNode *listNode, indexVal, tarVal int) {
if fistNode == nil {
return
}
curNode := fistNode
for curNode != nil && curNode.val != indexVal {
curNode = curNode.next
}
// 判断是走到最后都没有找到对应值还是找到对应值
if curNode == nil<