原文: https://www.programiz.com/dsa/linked-list-types

在本教程中,您将学习不同类型的链表。 此外,您还将在 C 中找到链表的实现。

链表有三种常见类型。

  1. 单链表
  2. 双链表
  3. 循环链表

单链表

这是最常见的。 每个节点都有数据和指向下一个节点的指针。

链表的类型 - 单链,双链和循环链 - 图1

单链表

节点表示为:

  1. struct node {
  2. int data;
  3. struct node *next;
  4. }

可以将三个成员的单链表创建为:

  1. /* Initialize nodes */
  2. struct node *head;
  3. struct node *one = NULL;
  4. struct node *two = NULL;
  5. struct node *three = NULL;
  6. /* Allocate memory */
  7. one = malloc(sizeof(struct node));
  8. two = malloc(sizeof(struct node));
  9. three = malloc(sizeof(struct node));
  10. /* Assign data values */
  11. one->data = 1;
  12. two->data = 2;
  13. three->data = 3;
  14. /* Connect nodes */
  15. one->next = two;
  16. two->next = three;
  17. three->next = NULL;
  18. /* Save address of first node in head */
  19. head = one;

双链表

我们在双向链表中添加一个指向前一个节点的指针。 因此,我们可以朝任一方向前进:前进或后退。

链表的类型 - 单链,双链和循环链 - 图2

双链表

节点表示为

  1. struct node {
  2. int data;
  3. struct node *next;
  4. struct node *prev;
  5. }

可以创建一个三人双向链表

  1. /* Initialize nodes */
  2. struct node *head;
  3. struct node *one = NULL;
  4. struct node *two = NULL;
  5. struct node *three = NULL;
  6. /* Allocate memory */
  7. one = malloc(sizeof(struct node));
  8. two = malloc(sizeof(struct node));
  9. three = malloc(sizeof(struct node));
  10. /* Assign data values */
  11. one->data = 1;
  12. two->data = 2;
  13. three->data = 3;
  14. /* Connect nodes */
  15. one->next = two;
  16. one->prev = NULL;
  17. two->next = three;
  18. two->prev = one;
  19. three->next = NULL;
  20. three->prev = two;
  21. /* Save address of first node in head */
  22. head = one;

循环链表

循环链表是链表的变体,其中最后一个元素链接到第一个元素。 这形成一个循环。

链表的类型 - 单链,双链和循环链 - 图3

循环链表

循环链表可以是单链或双链。

  • 对于单链表,最后一项的下一个指针指向第一个项
  • 在双向链表中,第一个项目的prev指针也指向最后一个项目。

可以将三元循环单链表创建为:

  1. /* Initialize nodes */
  2. struct node *head;
  3. struct node *one = NULL;
  4. struct node *two = NULL;
  5. struct node *three = NULL;
  6. /* Allocate memory */
  7. one = malloc(sizeof(struct node));
  8. two = malloc(sizeof(struct node));
  9. three = malloc(sizeof(struct node));
  10. /* Assign data values */
  11. one->data = 1;
  12. two->data = 2;
  13. three->data = 3;
  14. /* Connect nodes */
  15. one->next = two;
  16. two->next = three;
  17. three->next = one;
  18. /* Save address of first node in head */
  19. head = one;