链表是一种动态数据结构,因为在创建链表时,无须知道链表的长度。
当插入一个结点时,我们只需要为新结点分配内存,然后调整指针的指向来确保新结点被链接到链表当中。内存分配不是在创建链表时一次性完成,而是每添加一个结点分配一次内存。
由于没有闲置的内存,链表的空间效率比数组高。
单链表
整个链表的存取必须从头指针开始进行,头指针指示链表的第一个结点的存储位置。
区分首元结点、头结点、头指针
首元结点:链表中的第一个结点
头结点:首元结点之前附设的结点
头指针:指向链表中第一个结点的指针。若有头结点,则指向头结点,若无,则指向首元结点。
ListNode
ListNode为结构体,定义如下:
struct ListNode
{
int val;
ListNode *next;
ListNode(int x): val(x), next(NULL){};
}