数据结构-单链表的头插法和尾插法-

单链表的头插法和尾插法

1. 头插法(Head Insertion)
  • 原理:每次将新节点插入到链表的头部(即原头节点的前面)。
  • 特点
    • 插入顺序与最终链表顺序 相反
    • 时间复杂度:O(1)(无需遍历)。
  • 示例
    • 插入顺序:1 → 2 → 3 → 链表最终顺序:3 → 2 → 1
2. 尾插法(Tail Insertion)
  • 原理:每次将新节点插入到链表的尾部(即原尾节点的后面)。
  • 特点
    • 插入顺序与最终链表顺序 一致
    • 时间复杂度:若维护尾指针则 O(1),否则需遍历到尾部 O(n)
  • 示例
    • 插入顺序:1 → 2 → 3 → 链表最终顺序:1 → 2 → 3

C语言实现

头插法代码
c 复制代码
#include <stdio.h>
#include <stdlib.h>

typedef struct Node {
    int data;
    struct Node* next;
} Node;

// 头插法函数
void insertHead(Node** head, int value) {
    Node* newNode = (Node*)malloc(sizeof(Node));
    newNode->data = value;
    newNode->next = *head;  // 新节点指向原头节点
    *head = newNode;        // 更新头指针
}

// 打印链表
void printList(Node* head) {
    Node* current = head;
    while (current != NULL) {
        printf("%d → ", current->data);
        current = current->next;
    }
    printf("NULL\n");
}

int main() {
    Node* head = NULL;
    insertHead(&head, 1);
    insertHead(&head, 2);
    insertHead(&head, 3);
    printList(head);  // 输出:3 → 2 → 1 → NULL
    return 0;
}
尾插法代码
c 复制代码
#include <stdio.h>
#include <stdlib.h>

typedef struct Node {
    int data;
    struct Node* next;
} Node;

// 尾插法函数(需维护尾指针)
void insertTail(Node** head, Node** tail, int value) {
    Node* newNode = (Node*)malloc(sizeof(Node));
    newNode->data = value;
    newNode->next = NULL;

    if (*head == NULL) {  // 空链表时
        *head = newNode;
        *tail = newNode;
    } else {
        (*tail)->next = newNode;  // 原尾节点指向新节点
        *tail = newNode;          // 更新尾指针
    }
}

// 打印链表
void printList(Node* head) {
    Node* current = head;
    while (current != NULL) {
        printf("%d → ", current->data);
        current = current->next;
    }
    printf("NULL\n");
}

int main() {
    Node* head = NULL;
    Node* tail = NULL;
    insertTail(&head, &tail, 1);
    insertTail(&head, &tail, 2);
    insertTail(&head, &tail, 3);
    printList(head);  // 输出:1 → 2 → 3 → NULL
    return 0;
}

关键点总结

  1. 头插法:直接操作头指针,无需遍历。
  2. 尾插法:需维护尾指针(或每次遍历到尾部),效率更高。
  3. 注意事项
    • 插入前需分配内存(malloc),删除时需释放内存(free)。
    • 处理空链表的边界条件(如首次插入时头/尾指针的初始化)。

总结

看上去的区别不太大

只是输出是相反的。和常识一致,是尾插法,先插进去的,位子靠前。

头插法;先处理s 后处理r

尾插法 先处理 r 后处理是;

相关推荐
郝学胜_神的一滴16 小时前
CMake 034:生成器表达式:解耦构建时序、精简分支逻辑的终极利器
c++·cmake
见过夏天1 天前
C++ 基础入门完全指南
c++
CSharp精选营2 天前
关系型 vs 非关系型:从原理到选型,一文搞定数据库核心分类
数据结构·nosql·关系型数据库·非关系型数据库·技术选型
用户805533698033 天前
不止三件套:QObject 属性系统全关键字与运行时反射!
c++·qt
BadBadBad__AK3 天前
线段树维护区间 k 次方和
c++·数学·算法·stl
卷无止境4 天前
Eigen 库如何借助 OpenMP 加速计算
c++·后端
卷无止境4 天前
OpenMPI、MPICH 与 OpenMP:关系、核心概念与架构全解
c++·后端
郝学胜_神的一滴5 天前
CMake 30:循环语法全解|foreach_while双循环精讲、迭代技巧与实战避坑指南
c++·cmake
刘马想放假6 天前
Modbus 全栈技术解析:TCP、RTU、ASCII、RTU over TCP
数据结构·网络协议
北域码匠7 天前
冒泡排序太慢?鸡尾酒排序双向优化,原生 C# 零第三方库完整代码
数据结构·排序算法·泛型·c# 算法·鸡尾酒排序·原生 c# 开发·冒泡排序优化·嵌入式算法