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

单链表的头插法和尾插法

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 后处理是;

相关推荐
划破黑暗的第一缕曙光12 分钟前
[数据结构]:5.二叉树链式结构的实现1
数据结构
91刘仁德15 分钟前
c++类和对象(下)
c语言·jvm·c++·经验分享·笔记·算法
青桔柠薯片19 分钟前
数据结构:单向链表,顺序栈和链式栈
数据结构·链表
diediedei27 分钟前
模板编译期类型检查
开发语言·c++·算法
野犬寒鸦30 分钟前
从零起步学习并发编程 || 第一章:初步认识进程与线程
java·服务器·后端·学习
科技林总34 分钟前
【系统分析师】6.3 企业信息化规划
学习
mmz12071 小时前
分治算法(c++)
c++·算法
XiaoFan0121 小时前
将有向工作流图转为结构树的实现
java·数据结构·决策树
一切尽在,你来1 小时前
C++多线程教程-1.2.1 C++11/14/17 并发特性迭代
开发语言·c++
睡一觉就好了。1 小时前
快速排序——霍尔排序,前后指针排序,非递归排序
数据结构·算法·排序算法