📜  单链表 (1)

📅  最后修改于: 2023-12-03 15:07:21.182000             🧑  作者: Mango

单链表介绍

单链表(Singly Linked List),是链表的一种,是链表中最简单的一种形式。单链表的每个节点只包含一个指针,指向下一个节点,最后一个节点指向空值。下面将会进行更加详细的介绍。

概念

单链表是由若干个节点组成,每个节点只包含一个指针,指向下一个节点。最后一个节点的指针指向空值。单链表可以用来表示线性表或其他类似结构。

特点

单链表具有以下特点:

  1. 单向性:每个节点只有一个指针,指向下一个节点。
  2. 随机存取性:因为单链表是单向的,所以不能通过下标来随机访问节点,只能从头开始一个一个地找。
  3. 插入和删除的时间复杂度为 O(1) 。
节点

单链表中的每个节点都包含两个部分,一个是存放数据元素的数据域,另一个是存放下一个节点地址的指针域。下面是示例代码:

typedef struct Node {
    int data;           // 数据域
    struct Node *next;  // 指针域
} Node;

下面是一个单链表节点的示意图:

      +--------+--------+
      |  data  |  next  |
      +--------+--------+
操作

单链表的基本操作包括:

  1. 初始化操作。
  2. 插入操作。
  3. 删除操作。
  4. 查找操作。
  5. 遍历操作。
初始化操作

在单链表被使用之前,必须对其进行初始化。初始化操作通常包括创建空链表、设置链表头等。下面是示例代码:

// 创建链表头指针
Node *head = NULL;

// 创建空链表
head = (Node *)malloc(sizeof(Node));
head->next= NULL;
插入操作

单链表的插入操作包括头插法和尾插法。头插法是将新节点插入到链表头之后,尾插法是将新节点插入到链表尾之后。下面是示例代码:

// 头插法
Node *p = NULL;
p = (Node *)malloc(sizeof(Node));
p->data = 1;
p->next = head->next;
head->next = p;

// 尾插法
Node *p = NULL;
Node *tail = NULL;
p = (Node *)malloc(sizeof(Node));
tail = head;
while (tail->next != NULL) {
    tail = tail->next;
}
p->data = 1;
p->next = NULL;
tail->next = p;
删除操作

单链表的删除操作需要知道要删除的节点的前驱节点。删除操作通常分为删除头节点和删除中间节点。下面是示例代码:

// 删除头节点
Node *p = NULL;
p = head->next;
head->next = p->next;
free(p);

// 删除中间节点
Node *p = NULL;
Node *q = NULL;
p = head;
while (p->next != NULL && p->next->data != data) {
    p = p->next;
}
if (p->next != NULL) {
    q = p->next;
    p->next = q->next;
    free(q);
}
查找操作

单链表的查找操作需要遍历整个链表来查找相应的元素。下面是示例代码:

Node *p = head->next;
while (p != NULL && p->data != data) {
    p = p->next;
}
if (p != NULL) {
    // 找到了
} else {
    // 没有找到
}
遍历操作

单链表的遍历操作就是依次访问链表中的每个节点。下面是示例代码:

Node *p = head->next;
while (p != NULL) {
    // 对每个节点进行处理
    p = p->next;
}
总结

单链表是链表常用的一种形式,具有随机存取性差、插入和删除操作快的特点。掌握单链表的基本操作对于理解其他链表结构具有重要意义。