分类: C/C++2010-10-23 17:23 18425人阅读 评论(22) 收藏 举报

设链表节点为

  1. typedef struct tagListNode{
  2. int data;
  3. struct tagListNode* next;
  4. }ListNode, *List;

要求将一带链表头List head的单向链表逆序。

分析:

1). 若链表为空或只有一个元素,则直接返回;

2). 设置两个前后相邻的指针p,q. 将p所指向的节点作为q指向节点的后继;

3). 重复2),直到q为空

4). 调整链表头和链表尾

示例:以逆序A->B->C->D为例,图示如下

实现及测试代码如下:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. typedef struct tagListNode{
  4. int data;
  5. struct tagListNode* next;
  6. }ListNode, *List;
  7. void PrintList(List head);
  8. List ReverseList(List head);
  9. int main()
  10. {
  11. //分配链表头结点
  12. ListNode *head;
  13. head = (ListNode*)malloc(sizeof(ListNode));
  14. head->next = NULL;
  15. head->data = -1;
  16. //将[1,10]加入链表
  17. int i;
  18. ListNode *p, *q;
  19. p = head;
  20. for(int i = 1; i <= 10; i++)
  21. {
  22. q = (ListNode *)malloc(sizeof(ListNode));
  23. q->data = i;
  24. q->next = NULL;
  25. p->next = q;
  26. p = q;
  27. }
  28. PrintList(head);           /*输出原始链表*/
  29. head = ReverseList(head);  /*逆序链表*/
  30. PrintList(head);           /*输出逆序后的链表*/
  31. return 0;
  32. }
  33. List ReverseList(List head)
  34. {
  35. if(head->next == NULL || head->next->next == NULL)
  36. {
  37. return head;   /*链表为空或只有一个元素则直接返回*/
  38. }
  39. ListNode *t = NULL,
  40. *p = head->next,
  41. *q = head->next->next;
  42. while(q != NULL)
  43. {
  44. t = q->next;
  45. q->next = p;
  46. p = q;
  47. q = t;
  48. }
  49. /*此时q指向原始链表最后一个元素,也是逆转后的链表的表头元素*/
  50. head->next->next = NULL;  /*设置链表尾*/
  51. head->next = p;           /*调整链表头*/
  52. return head;
  53. }
  54. void PrintList(List head)
  55. {
  56. ListNode* p = head->next;
  57. while(p != NULL)
  58. {
  59. printf("%d ", p->data);
  60. p = p->next;
  61. }
  62. printf("/n");
  63. }

最新文章

  1. C++ activemq CMS 学习笔记.
  2. 引用log4j.jar包后,出现告警
  3. service postgresql initdb [FAILED]
  4. js用ajax和不同页面的php互相传值的方法
  5. 常用命令之ps
  6. GPU crash unmap page access
  7. EIG集团简单介绍
  8. Selenium WebDriver 中鼠标和键盘事件分析及扩展(转)
  9. MIST
  10. Windows多桌面切换(CreateDesktop,SwitchDesktop函数)
  11. 自己动手写CPU之第八阶段(4)——转移指令实现过程2
  12. 如何写兼容浏览器和Node.js环境的Javascript代码
  13. 【CRC校验】学习笔记
  14. javascript 总结学习一
  15. MySQL执行计划extra中的using index 和 using where using index 的区别
  16. [bzoj2665] [cqoi2012]编号
  17. mobiscroll2.5.4 日期组件
  18. DB(1):SQLAPI catch [Bind variable/parameter &#39;pay_acc_id&#39; not found] !!!
  19. java虚拟机 之 垃圾回收机制
  20. 流媒体技术学习笔记之(一)nginx+nginx-rtmp-module+ffmpeg搭建流媒体服务器

热门文章

  1. C#截取字符串(转载)
  2. Oracle安装后遇到错误:The Network Adapter could not establish the connection
  3. pch文件配置
  4. xamarin.Android ImageView 异步加载网络图片
  5. 了解RabbitMQ
  6. (文章也有问题,请自行跳过)react中的状态机每次setState都是重新创建新的对象,如需取值,应该在render中处理。
  7. arcgis 加载高德地图 es6的方式
  8. CVE-2018-10945 mongoose越界访问
  9. vue router 配合transition 切换动画
  10. mysql 运行 sql 脚本