单向链表

title

单向链表(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;
}

该示例实现了一个单向链表,包含插入节点到链表头部和尾部、删除节点、以及遍历链表并打印节点值的基本操作。

powered by Gitbook© 2023 编外计划 | 最后修改: 2023-11-24 03:37:00

results matching ""

    No results matching ""