面试啦,写个linkedlist

本文介绍了一个简单的链表数据结构的实现及其基本操作,包括创建、插入、删除、反转和打印等,并提供了完整的C语言源代码示例。
  1. // linkedlist.cpp : 定义控制台应用程序的入口点。
  2. //

  3. #include "stdafx.h"
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <assert.h>

  7. typedef struct node
  8. {
  9.     int data;
  10.     struct node* next;
  11. }Node, *PNode;

  12. PNode newNode(int data)
  13. {
  14.     PNode p = (PNode)malloc(sizeof(Node));
  15.     assert(p != NULL);
  16.     p->data = data;
  17.     p->next = NULL;
  18.     return p;
  19. }

  20. // PNode tail(PNode head, int *length)
  21. // {
  22. //     assert( head != NULL);
  23. //     PNode p;
  24. //     p = head;
  25. //     *length = 0;
  26. //     while ( p->next != NULL )
  27. //     {
  28. //         p = p->next;
  29. //         (*length)++;
  30. //     }
  31. //     return p;
  32. // }

  33. PNode create()
  34. {
  35.     PNode p= newNode(0);
  36.     return p;
  37. }

  38. int insert(PNode head, PNode s)
  39. {
  40.     assert (head != NULL && s != NULL);
  41.     PNode prev;
  42.     prev = head;
  43.     int i=0;
  44.     while ( prev->next != NULL )
  45.     {
  46.         prev = prev->next;
  47.     }

  48.     prev->next = s;
  49.     s->next = NULL;
  50.     return i;
  51. }

  52. void del(PNode head)
  53. {
  54.     assert (head != NULL);
  55.     PNode p, prev;
  56.     p = prev = head;

  57.     while ( p->next != NULL )
  58.     {
  59.         prev = p;
  60.         p = p->next;        
  61.     }
  62.     
  63.     free(p);
  64.     p = NULL;
  65.     prev->next = NULL;
  66. }

  67. PNode inverse(PNode head)
  68. {
  69.     assert (head != NULL);
  70.     PNode cur, prev, behind;
  71.     cur = prev = behind = head->next;
  72.     
  73.     behind = cur->next;
  74.     head->next = NULL;
  75.     cur->next = NULL;
  76.     while (behind->next != NULL)
  77.     {
  78.         prev = cur;
  79.         cur = behind;
  80.         behind = behind->next;
  81.         cur->next = prev;        
  82.     }
  83.     behind->next = cur;
  84.     PNode newhead = newNode(0);
  85.     newhead->next = behind;
  86.     return newhead;
  87. }

  88. int length(PNode head)
  89. {
  90.     assert (head != NULL);
  91.     int length=0;
  92.     PNode p = head;
  93.     while (p->next != NULL)
  94.     {
  95.         p = p->next;
  96.         length++;
  97.     }
  98.     return length;
  99. }

  100. void print(PNode head)
  101. {
  102.     assert(head != NULL);
  103.     PNode p = head->next;
  104.     printf("length: %d/n", length(head));

  105.     while (p != NULL)
  106.     {
  107.         printf("%d ", p->data);
  108.         p = p->next;
  109.     }

  110.     printf("/n");
  111. }


  112. int _tmain(int argc, _TCHAR* argv[])
  113. {
  114.     PNode head;
  115.     head = create();

  116.     int i;
  117.     for (i=0; i<10; i++)
  118.     {
  119.         insert(head, newNode(i));
  120.     }
  121.     
  122.     del(head);
  123.     head = inverse(head);
  124.     print(head);
  125.     return 0;
  126. }


把_tmain换成main就可以用gcc编译了.
### ArrayList 和 LinkedList 的比较 #### 数据结构基础 ArrayList 和 LinkedList 是两种常见的列表实现,在 Java 中都实现了 `List` 接口。然而,两者内部的数据存储机制不同,这影响了它们的操作性能。 - **ArrayList** 使用动态数组来保存元素[^3]。 - **LinkedList** 则通过双向链表的方式连接各个节点[^3]。 #### 性能差异分析 对于不同的操作,这两种数据结构表现出显著的不同: - **随机访问** - 对于 `ArrayList` 来说,由于其底层基于数组,因此支持高效的索引查找 O(1)。 - 而 `LinkedList` 需要遍历链表才能找到指定位置的元素,时间复杂度为 O(n),效率较低。 - **插入与删除** - 当涉及到频繁地向中间或头部添加新项时,`LinkedList` 更具优势,因为只需要调整相邻结点之间的指针即可完成操作,平均时间为常数级别 O(1)。 - 反之,如果是在固定大小接近满载的情况下执行此类动作,则 `ArrayList` 将不得不移动大量现有成员以腾出空间给新的条目,最坏情况下达到线性的开销 O(n)。 ```java // 插入到 List 开头的例子 list.add(0, element); ``` - **内存占用** - 每个 `LinkedList` 结点除了储存实际对象外还需额外记录前后链接的信息,所以通常会比相同长度下的 `ArrayList` 占用更多内存资源。 #### 应用场景建议 根据上述特性对比可知: - 如果应用程序主要涉及大量的读取而较少修改的话,推荐选用 `ArrayList`; - 若程序中有较多增删需求特别是针对两端的情况,那么 `LinkedList` 或许更适合一些。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值