什么是链表?
如果你有这个疑问,我建议学一下数据结构。对不知道要学些什么的同学有很大帮助。
这里我推荐一本我看过的书
《 大话数据结构 》
(如果想要免费的资源自己去找,我也不知道我之前看的那本书去哪了)
这本书比较入门,介绍了最基本的一些数据结构。推荐新手学习。
第三章就主要讲的链表,就是用结构体表示一个储存单元,结构体一般至少放两个元素,一个value(类型自己定义)用来储存数据,还有一个指针用来指向该节点的后继(也可以是前驱,随便怎么理解,目的是为了找到它之前或者之后的结点,一般理解为后继,也就是之后的结点。当然,如果是双向链表需要两个指针,一个指向前驱,一个指向后继)。这样通过指针将结点连接起来就是链表了。
结点
主要是value与指向下一个元素的指针,value根据需要自己定义,指针就是结点类型的指针。(如果是自己一个人写着玩,名字随便怎么取,只要自己明白就行了。如果要给别人看的,我劝你还是尽量取规范一定,不然别人看了会很难受)
这里是一个例子:
//结点
type ListNode struct {
Val int
Next *ListNode
}
功能
有了结点自然要实现它基本的功能才行,建立,插入,查找遍历,删除等等。其中建立链表是最关键的。为什么,我就不说了,遇到问题要多思考,多写注释。
构造简单链表示例:
package main
//结点
type ListNode struct {
Val int //数据(根据需要自行定义)
Next *ListNode //指向后继的指针
}
//构造新的结点
func newnode(num int) *ListNode {
node := ListNode{num, nil}
return &node
}
//创建链表(从尾部添加元素)
func creatlist(head *ListNode, a []int) *ListNode {
i := 0 //用于a【i】赋值
if head == nil { //若头为空,给头初始化
head = newnode(a[i])
i++
}
var tail *ListNode //尾部指针,用于连接链表
tail = head
//用for循环连接链表
for i < len(a) {
if tail.Next != nil {
tail = t.Next
} else {
tail.Next = newnode(a[i])
i++
}
}
return head
}
func main() {
a := []int{1, 2, 3}
var head *ListNode
head = creatlist(head, a)
}
在头部添加元素更简单,有兴趣的小伙伴自己去尝试吧。
遍历链表示例:
func looklist(head *ListNode) {
for head != nil {
fmt.Printf("%#v->", head.Val)
head = head.Next //按顺序依次向下遍历
}
}
删除结点就是将该结点前面一个结点的后继指向该结点的后继,使该结点从链表中断开。说着有点绕,直接看代码吧。
//删除值为val的结点
func deletenode(val int, head *ListNode) *ListNode {
if head.Val == val {
head = head.Next //若头结点为需要删除结点,将头节点后移即可
return head
}
tem := head
for tem != nil {
if tem.Next.Val == val {
tem.Next = tem.Next.Next // 抛弃值为val的结点
return head
}
}
return head
}
链表还有许多其他功能我就不写了,有兴趣自己去尝试。
无论是golang还是其他语言,数据结构与功能都是基本相同的,只要你在一种语言会写,在其他语言上也基本没什么问题。还是那句话,有问题多尝试,多思考,多写注释。