首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

linux 单向链表

基础概念

单向链表(Singly Linked List)是一种线性数据结构,其中每个元素(称为节点)包含一个数据域和一个指针域。这个指针域指向链表中的下一个节点。链表的第一个节点称为头节点(head),最后一个节点的指针域指向空(NULL),表示链表的结束。

优势

  1. 动态内存分配:链表在运行时动态分配内存,不需要预先知道数据的大小。
  2. 插入和删除操作高效:在链表中插入或删除节点只需要改变相邻节点的指针,时间复杂度为O(1)(假设已经找到要插入或删除的位置)。
  3. 内存利用率高:链表不需要连续的内存空间,可以更灵活地利用内存。

类型

  1. 单链表:每个节点只有一个指向下一个节点的指针。
  2. 双链表:每个节点有两个指针,一个指向前一个节点,一个指向后一个节点。
  3. 循环链表:最后一个节点的指针指向第一个节点,形成一个环。

应用场景

  1. 动态数据存储:当数据量不确定或需要频繁插入和删除操作时,链表是一个很好的选择。
  2. 实现栈和队列:链表可以用来实现栈和队列等数据结构。
  3. 内存管理:链表可以用于管理动态分配的内存块。

示例代码

以下是一个简单的单链表实现,包括节点定义和基本操作(插入、删除、遍历):

代码语言:txt
复制
#include <stdio.h>
#include <stdlib.h>

// 定义链表节点结构
struct Node {
    int data;
    struct Node* next;
};

// 创建新节点
struct Node* createNode(int data) {
    struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
    newNode->data = data;
    newNode->next = NULL;
    return newNode;
}

// 在链表头部插入节点
void insertAtHead(struct Node** head, int data) {
    struct Node* newNode = createNode(data);
    newNode->next = *head;
    *head = newNode;
}

// 删除链表中的节点(假设节点存在)
void deleteNode(struct Node** head, int key) {
    struct Node* temp = *head;
    struct Node* prev = NULL;

    if (temp != NULL && temp->data == key) {
        *head = temp->next;
        free(temp);
        return;
    }

    while (temp != NULL && temp->data != key) {
        prev = temp;
        temp = temp->next;
    }

    if (temp == NULL) return;

    prev->next = temp->next;
    free(temp);
}

// 遍历并打印链表
void printList(struct Node* node) {
    while (node != NULL) {
        printf("%d -> ", node->data);
        node = node->next;
    }
    printf("NULL\n");
}

int main() {
    struct Node* head = NULL;

    insertAtHead(&head, 3);
    insertAtHead(&head, 2);
    insertAtHead(&head, 1);

    printf("Linked List:\n");
    printList(head);

    deleteNode(&head, 2);

    printf("After deleting 2:\n");
    printList(head);

    return 0;
}

参考链接

常见问题及解决方法

  1. 内存泄漏:在删除节点时,确保释放了相应的内存。
  2. 内存泄漏:在删除节点时,确保释放了相应的内存。
  3. 空指针引用:在访问节点的next指针之前,确保节点不为空。
  4. 空指针引用:在访问节点的next指针之前,确保节点不为空。
  5. 链表遍历错误:在遍历链表时,确保正确处理头节点和尾节点的情况。
  6. 链表遍历错误:在遍历链表时,确保正确处理头节点和尾节点的情况。

通过以上内容,你应该对Linux下的单向链表有了全面的了解,包括其基础概念、优势、类型、应用场景以及常见问题的解决方法。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

32分2秒

Java零基础-208-单向链表数据结构

14分39秒

16-尚硅谷-Scala数据结构和算法-单向链表-删除节点

23分5秒

13-尚硅谷-Scala数据结构和算法-单向链表-添加和遍历

16分30秒

14-尚硅谷-Scala数据结构和算法-单向链表-有序插入节点

10分32秒

15-尚硅谷-Scala数据结构和算法-单向链表-修改节点

10分38秒

12-尚硅谷-Scala数据结构和算法-单向链表-人员管理系统说明

14分33秒

107 尚硅谷-Linux云计算-网络服务-rsync-单向实时同步

2分30秒

076-单向消息发送代码举例

18分4秒

38、前端基础-Vue-指令-单向绑定&双向绑定

33分29秒

11. 尚硅谷_佟刚_Hibernate_单向多对一映射

21分40秒

07-尚硅谷-Scala数据结构和算法-单向队列实现

16分47秒

08-尚硅谷-Scala数据结构和算法-单向队列问题分析

领券