golang链表建立

什么是链表?

如果你有这个疑问,我建议学一下数据结构。对不知道要学些什么的同学有很大帮助。
这里我推荐一本我看过的书

《 大话数据结构 》

(如果想要免费的资源自己去找,我也不知道我之前看的那本书去哪了)

这本书比较入门,介绍了最基本的一些数据结构。推荐新手学习。
第三章就主要讲的链表,就是用结构体表示一个储存单元,结构体一般至少放两个元素,一个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还是其他语言,数据结构与功能都是基本相同的,只要你在一种语言会写,在其他语言上也基本没什么问题。还是那句话,有问题多尝试,多思考,多写注释。

你可能感兴趣的:(golang学习,golang,开发语言)