• 【数据结构】单链表的尾插法


    尾插法是一种在链表末尾插入新元素的方法,它的核心思想是保持链表的尾部指针(或称为尾节点),这样可以在常数时间内完成尾部插入操作。尾插法的主要步骤如下:

    1. 创建新节点:首先,根据需要插入的数据创建一个新的链表节点。

    2. 定位尾部:如果是第一次插入,即链表为空,新节点直接成为头节点。如果链表不为空,需要定位到链表的尾部。

    3. 更新尾部:将新节点插入到当前尾部节点的后面,并更新尾部指针(或尾部节点的next指针)以指向新节点。

    4. 维护尾部指针:在插入操作完成后,确保尾部指针指向新的尾部节点。在某些实现中,可能会使用一个额外的指针来始终指向尾部节点,这样可以避免每次插入时都需要遍历链表来找到尾部。

    尾插法的优点是插入操作的时间复杂度为O(1),因为不需要遍历链表来找到插入位置,只需要修改尾部节点的next指针。这种方法在实现队列时非常有用,因为队列的入队操作通常需要在尾部插入元素。

    在双向链表或循环链表中,尾插法还需要维护额外的指针,例如前驱指针和循环链表的头节点指针,但基本思想是相同的:找到尾部并在其后面插入新节点。

    以下是一个使用尾插法在单向链表中插入新元素的C语言示例:

    1. #include <stdio.h>
    2. #include <stdlib.h>
    3. // 定义链表节点结构体
    4. typedef struct Node {
    5. int data;
    6. struct Node* next;
    7. } Node;
    8. // 创建一个新的节点
    9. Node* createNode(int data) {
    10. Node* newNode = (Node*)malloc(sizeof(Node));
    11. if (!newNode) {
    12. printf("内存分配失败\n");
    13. exit(0);
    14. }
    15. newNode->data = data;
    16. newNode->next = NULL;
    17. return newNode;
    18. }
    19. // 使用尾插法在链表尾部插入新节点
    20. void insertAtTail(Node** head, int data) {
    21. Node* newNode = createNode(data);
    22. if (*head == NULL) {
    23. // 如果链表为空,新节点成为头节点
    24. *head = newNode;
    25. return;
    26. }
    27. Node* current = *head;
    28. // 遍历链表直到找到最后一个节点
    29. while (current->next != NULL) {
    30. current = current->next;
    31. }
    32. // 将新节点插入到链表的尾部
    33. current->next = newNode;
    34. }
    35. // 打印链表
    36. void printList(Node* head) {
    37. Node* current = head;
    38. while (current != NULL) {
    39. printf("%d -> ", current->data);
    40. current = current->next;
    41. }
    42. printf("NULL\n");
    43. }
    44. // 主函数
    45. int main() {
    46. Node* head = NULL;
    47. insertAtTail(&head, 1);
    48. insertAtTail(&head, 3);
    49. insertAtTail(&head, 5);
    50. insertAtTail(&head, 7);
    51. printf("链表元素: ");
    52. printList(head);
    53. return 0;
    54. }

    在这个例子中,insertAtTail函数接受一个指向头节点的指针的指针,以及要插入的新节点的数据。首先,它创建一个新节点。然后,如果链表为空,新节点成为头节点。如果链表不为空,函数遍历链表直到找到最后一个节点,并将新节点插入到最后一个节点的后面。

    printList函数用于打印链表中的所有元素,以验证尾插法是否正确执行。

    结语

    以上就是尾插法的基本使用,本次代码分享到此结束。

    最后的最后,还请大家点点赞,点点关注,谢谢大家!

  • 相关阅读:
    SecretFlow之SCQL部署(P2P方案)避雷纯享版
    @Configuration注解的知识点
    House of apple 一种新的glibc中IO攻击方法
    JVS规则引擎,打造智能自动化决策的利器
    Vue中如何进行瀑布流布局与图片加载优化
    html在线商城购物网站制作——基于HTML+CSS+JavaScript(oppo手机商城 6页)
    洛谷-Directed Roads-(基环树总结)
    IDEA中使用Git
    从Docker Hub获取镜像和创建容器
    无线渗透-WPA攻击
  • 原文地址:https://blog.csdn.net/m0_74055118/article/details/138097419