引言
数组和链表都是线性数据结构,数组是连续的内存空间,而链表内存空间的存储是非连续的。目前考的比较多的题是环形链表、链表相交节点,有序链表合并。
链表定义
链表以节点为单位,每个元素都是一个独立对象,在内存空间的存储是非连续的。单链表的节点对象具有两个成员变量:「值 Val」,「后继节点引用 Next」 。
type ListNode struct{
Val int
Next *ListNode
}
如下图所示,建立此链表需要实例化每个节点,并构建各节点的引用指向。
// 实例化节点
n1 := &ListNode{Val: 4, Next: nil} // 节点 head
n2 := &ListNode{Val: 5, Next: nil}
n3 := &ListNode{Val: 1, Next: nil}
// 构建引用指向
n1.Next = n2
n2.Next = n3
双链表
// 节点结构体
type ListNode struct {
Val int
Next *ListNode
Pre *ListNode
}
双链表:每一个节点有两个指针域,一个指向下一个节点,一个指向上一个节点。
双链表 既可以向前查询也可以向后查询。
如图所示:
循环链表
循环链表,即首尾相连。
循环链表可以用来解决约瑟夫环问题。
删除链表的节点
如果使用C,C++编程语言的话,删除节点时,不要仅仅修改指针指向,还要从内存中删除移除的节点, 清理节点内存。
如果使用Go,java ,python的话就不用手动管理内存了。