单链表的基本概念、数据结构实现以及常见操作

举报
wljslmz 发表于 2023/05/31 22:22:37 2023/05/31
【摘要】 单链表是一种基础的数据结构,也是面试中常见的考点之一。在工作和学习中,我们经常需要对单链表进行各种操作,因此掌握单链表的基本操作是非常必要的。本文将详细介绍单链表的基本概念、数据结构实现以及常见操作。 一、单链表的基本概念单链表是由若干个节点组成的数据结构,每个节点包含两部分内容:数据域(存储元素)和指针域(指向下一个节点)。单链表中的第一个节点叫做头结点,通常不存放数据元素,只是为了方便操...

单链表是一种基础的数据结构,也是面试中常见的考点之一。在工作和学习中,我们经常需要对单链表进行各种操作,因此掌握单链表的基本操作是非常必要的。本文将详细介绍单链表的基本概念、数据结构实现以及常见操作。

一、单链表的基本概念

单链表是由若干个节点组成的数据结构,每个节点包含两部分内容:数据域(存储元素)和指针域(指向下一个节点)。

单链表中的第一个节点叫做头结点,通常不存放数据元素,只是为了方便操作而存在。而最后一个节点通常被称为尾结点,它的指针指向空。

二、数据结构实现

在 C 语言中,单链表可以通过结构体和指针来实现。我们定义一个结构体来表示节点,包含两个成员:数据域和指针域。其中,数据域可以是任意类型的数据,指针域则指向下一个节点。

typedef struct ListNode {
    int val;
    struct ListNode *next;
} ListNode;

三、常见单链表操作

1. 创建单链表

创建单链表是单链表操作中的一项重要操作。我们可以通过循环读入节点数据,然后创建节点并将它们链接成一个链表。

ListNode* createLinkedList() {
    ListNode *head, *p, *q;
    int n, val;
    head = p = (ListNode*)malloc(sizeof(ListNode));
    p->next = NULL;
    printf("请输入元素个数:");
    scanf("%d", &n);
    for (int i = 0; i < n; i++) {
        printf("请输入第%d个元素的值:", i+1);
        scanf("%d", &val);
        q = (ListNode*)malloc(sizeof(ListNode));
        q->val = val;
        q->next = NULL;
        p->next = q;
        p = q;
    }
    return head;
}

2. 遍历单链表

遍历单链表是指依次访问链表中每个节点,并执行相应的操作。我们可以通过循环来遍历单链表,从头结点开始,依次访问每个节点并输出它的值。

void traverseLinkedList(ListNode* head) {
    ListNode *p;
    p = head->next;
    while (p != NULL) {
        printf("%d ", p->val);
        p = p->next;
    }
    printf("\n");
}

3. 插入元素到单链表

在单链表中插入元素是指在指定位置上添加一个新的节点。我们可以通过遍历单链表来找到指定位置,并在该位置上插入新的节点。

void insertLinkedList(ListNode* head, int index, int val) {
    ListNode *p, *q;
    p = head;
    for (int i = 0; i < index-1; i++) {
        p = p->next;
        if (p == NULL) {
            printf("插入位置无效!\n");
            return;
        }
    }
    q = (ListNode*)malloc(sizeof(ListNode));
    q->val = val;
    q->next = p->next;
    p->next = q;
}

4. 删除单链表中的节点

删除单链表中的节点是指删除指定位置上的节点。我们可以通过遍历单链表来找到需要删除的节点,然后将该节点从链表中删除。

void deleteLinkedList(ListNode* head, int index) {
    ListNode *p, *q;
    p = head;
    for (int i = 0; i < index-1; i++) {
        p = p->next;
        if (p == NULL || p->next == NULL) {
            printf("删除位置无效!\n");
            return;
        }
    }
    q = p->next;
    p->next = q->next;
    free(q);
}

5. 反转单链表

反转单链表是非常重要的一种操作,它可以使得单链表中的所有节点按照相反的顺序排列。我们可以通过遍历单链表,将节点的指针方向调整为反向来实现单链表的反转。

ListNode* reverseLinkedList(ListNode* head) {
    ListNode *p, *q, *r;
    p = head->next;
    q = NULL;
    while (p != NULL) {
        r = p->next;
        p->next = q;
        q = p;
        p = r;
    }
    head->next = q;
    return head;
}

6. 寻找单链表中的中间节点

寻找单链表中的中间节点可以帮助我们解决一些实际问题,例如去掉一个包含偶数个节点的链表的头尾节点后,寻找剩余链表的中间节点。

ListNode* findMiddleNode(ListNode* head) {
    ListNode *p, *q;
    p = q = head->next;
    while (q != NULL && q->next != NULL) {
        p = p->next;
        q = q->next->next;
    }
    return p;
}

四、总结

本文介绍了单链表的基本概念、数据结构实现以及常见操作。针对每种操作,我们通过代码实现进行了详细的讲解。对于初学者来说,掌握单链表的这些基本操作非常重要,它们是开展后续数据结构和算法学习的基础。在实际工作中,我们也常常需要使用到单链表,例如实现某些功能、解决某些问题等。因此,通过本文的学习,你可以掌握单链表的基础知识,从而更好地解决实际问题。

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。