📅  最后修改于: 2023-12-03 15:42:08.012000             🧑  作者: Mango
链表是一种常见的数据结构,它通过节点之间的指针联系起来,每个节点包含数据和指向下一个节点的指针。链表的常见类型有单链表、双链表和循环链表。
单链表是链表的最基本类型,每个节点只包含一个指针指向下一个节点,最后一个节点指向空。单链表的优点是插入和删除节点容易,时间复杂度为O(1),但是查找某个节点需要遍历整个链表,时间复杂度为O(n)。
以下是单链表的结构体定义:
typedef struct node {
int data;
struct node *next;
} Node;
其中data
表示节点的数据,next
表示指向下一个节点的指针。
双链表是在单链表的基础上每个节点多了一个指针指向前一个节点。这样在删除和插入节点时,不仅需要更新前一个节点指向当前节点的指针,也需要更新后一个节点指向当前节点的指针。双链表的优点是在查找某个节点时,如果知道该节点的后继节点,时间复杂度为O(1)。但是每个节点多一个指针,消耗内存空间。
以下是双链表的结构体定义:
typedef struct node {
int data;
struct node *prev;
struct node *next;
} Node;
其中data
表示节点的数据,prev
表示指向前一个节点的指针,next
表示指向下一个节点的指针。
循环链表和单链表或双链表的区别在于,最后一个节点的指针不再指向空,而是指向链表头部形成一个循环。循环链表的优点是可以很方便的从最后一个节点访问到第一个节点,但是对于删除和插入节点,需要像单链表或双链表一样更新相邻节点的指针。
以下是循环链表的结构体定义:
typedef struct node {
int data;
struct node *next;
} Node;
typedef struct {
struct node *head;
} LinkedList;
其中head
指向链表头部,最后一个节点的next
指向head
,形成循环。