单向链表
单向链表(Singly linked list)是一种常见的数据结构,它由多个节点组成,每个节点包含两个域:数据域和指针域。数据域用来存储节点的数据,指针域用来指向下一个节点,最后一个节点的指针域指向空值。
单向链表的优点是插入和删除元素时非常高效,只需要改变指针的指向即可,时间复杂度为 O(1)。但是,它的缺点是访问元素的时间复杂度为 O(n),因为链表中的元素是不连续的,必须从头节点开始遍历才能找到对应的元素。
单向链表常见的操作有:
遍历:从头节点开始遍历整个链表,每个节点通过指针指向下一个节点,直到遍历到最后一个节点。
插入:在链表中插入一个新节点,可以在头部、尾部或指定位置插入。
删除:从链表中删除一个节点,可以删除头部、尾部或指定位置的节点。
以下是一个简单的C语言单向链表的示例代码:
#include <stdio.h>
#include <stdlib.h>
// 链表节点结构体
struct node {
int data;
struct node* next;
};
// 插入节点到链表头部
void insert_front(struct node** head, int data) {
struct node* new_node = (struct node*)malloc(sizeof(struct node));
new_node->data = data;
new_node->next = *head;
*head = new_node;
}
// 插入节点到链表尾部
void insert_back(struct node** head, int data) {
struct node* new_node = (struct node*)malloc(sizeof(struct node));
struct node* last = *head;
new_node->data = data;
new_node->next = NULL;
// 如果链表为空,将新节点作为头结点
if (*head == NULL) {
*head = new_node;
return;
}
// 找到最后一个节点
while (last->next != NULL) {
last = last->next;
}
// 将新节点连接到最后一个节点后面
last->next = new_node;
}
// 删除链表中第一个值为data的节点
void delete_node(struct node** head, int data) {
struct node* temp = *head;
struct node* prev = NULL;
// 如果要删除的节点是头节点
if (temp != NULL && temp->data == data) {
*head = temp->next;
free(temp);
return;
}
// 找到要删除的节点,并记录其前一个节点
while (temp != NULL && temp->data != data) {
prev = temp;
temp = temp->next;
}
// 如果要删除的节点不存在
if (temp == NULL) {
return;
}
// 将前一个节点连接到要删除的节点后一个节点
prev->next = temp->next;
// 释放要删除的节点内存
free(temp);
}
// 遍历链表并打印节点的值
void print_list(struct node* node) {
while (node != NULL) {
printf("%d ", node->data);
node = node->next;
}
}
// 测试代码
int main() {
struct node* head = NULL;
insert_front(&head, 3);
insert_front(&head, 2);
insert_front(&head, 1);
printf("链表插入头部后:");
print_list(head);
printf("\n");
insert_back(&head, 4);
insert_back(&head, 5);
printf("链表插入尾部后:");
print_list(head);
printf("\n");
delete_node(&head, 3);
printf("删除节点3后:");
print_list(head);
printf("\n");
return 0;
}
该示例实现了一个单向链表,包含插入节点到链表头部和尾部、删除节点、以及遍历链表并打印节点值的基本操作。