【数据结构与算法】链表与队列

:如果你也对机器人、人工智能感兴趣,看来我们志同道合✨
:不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】
:文章若有幸对你有帮助,可点赞 收藏 ⭐不迷路
:内容若有错误,敬请留言 指正!原创文,转载请注明出处

文章目录

  • 前言:顺序表的优缺点
  • 线性表的链式表示和实现
    • 与链式存储有关的术语
  • 单链表
    • 单链表的特点
    • 单链表的创建
  • 双向链表


https://blog.csdn.net/Edward_Asia/article/details/120876314
https://www.zhihu.com/question/315752464

前言:顺序表的优缺点

顺序表的特点:以物理位置相邻表示逻辑关系。
顺序表的优点:任一元素均可随机存取。
顺序表的缺点:进行插入和删除操作时,需移动大量的元素。其次, 存储空间不灵活,空间大小有限

由于顺序表存在以上的这些优缺点,才开始有替代它的数据结构出现:线性表。

线性表的链式表示和实现

链式存储结构:结点在存储器中的位置是任意的,即逻辑上相邻的数据元素在物理上不一定相邻 线性表的链式表示又称为非顺序映像或链式映像。
每个节点由两个域组成
1、数据域:存储元素数值数据;
2、指针域:存储直接后继结点的存储位置。

【数据结构与算法】链表与队列_第1张图片
【数据结构与算法】链表与队列_第2张图片
只要找到头指针,便能顺藤摸怪找到其他元素,这就是链表的结构特点。单链表是由头指针唯一确定,因此单链表可以用头指针的名字来命名。其次,单链表的尾部由于没有指向下一个元素了,因此其指针域为空NULL

与链式存储有关的术语

1、结点:数据元素的存储映像。由数据域和指针域两部分组成
2、链表:n个结点由指针链组成一个链表。

单链表

单链表的特点

单链表(Singly Linked List)是一种常见的数据结构,具有以下特点:

1、链式存储:单链表使用节点来存储数据,并通过节点之间的链接关系组织起来。每个节点都包含数据和一个指向下一个节点的指针(通常称为“next”指针)。

2、动态大小:单链表的大小可以根据需要动态地增长或缩小,因为它使用了动态内存分配。这使得在插入或删除节点时不需要移动其他节点,相比于数组,单链表更灵活。

3、顺序访问:由于单链表只能从头部开始顺序访问,无法直接访问中间或尾部的节点。要访问某个特定位置的节点,需要从头节点开始按照链接依次遍历到目标位置。

4、插入和删除效率较高:相对于数组,单链表在插入和删除节点的操作上具有较高的效率。在已知位置的情况下,插入和删除一个节点的时间复杂度为
O(1)。但是,要找到插入或删除的位置可能需要遍历整个链表,平均时间复杂度为 O(n)。

单链表的创建

typedef struct Node {
    int data;           // 节点中存储的数据
    struct Node* next;  // 指向下一个节点的指针
} Node;

// 创建链表
Node* createLinkedList(int arr[], int size) {
    if (size == 0) {
        return NULL;
    }

    Node* head = (Node*)malloc(sizeof(Node));
    head->data = arr[0];
    head->next = NULL;
    Node* tail = head;

    for (int i = 1; i < size; i++) {
        Node* newNode = (Node*)malloc(sizeof(Node));
        newNode->data = arr[i];
        newNode->next = NULL;
        tail->next = newNode;
        tail = newNode;
    }

    return head;
}

在上述代码中,我们定义了一个名为 Node 的结构体类型,表示单链表的节点。
该结构体包含两个成员:data 和 next。
data 表示节点中存储的数据,可以是任意类型的数据。
next 是指向下一个节点的指针(也可以为空指针)。 通过将多个节点按照 next 指针链接起来,就形成了一个完整的单链表。

双向链表

双向链表的节点结构:有前驱和后继指针
Data:节点
Prev:节点的前驱指针
Next:节点的后继指针

你可能感兴趣的:(#,数据结构与算法,链表,数据结构)