【C/C++练习题】反转链表

举报
王建峰 发表于 2021/11/19 01:30:33 2021/11/19
【摘要】 《剑指Offer》面试题24:反转链表   1 题目 定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。   2 分析 改变节点的指向,引用改节点需要两个指针,一个用于指向当前指针p1,另一个用来指向它的上一个节点。另外,为了防止操作过程中链表(p1节点与其下一个节点)断开而丢失,...

《剑指Offer》面试题24:反转链表

 


1 题目

定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。

 

2 分析

改变节点的指向,引用改节点需要两个指针,一个用于指向当前指针p1,另一个用来指向它的上一个节点。另外,为了防止操作过程中链表(p1节点与其下一个节点)断开而丢失,要一个指针p3来保存下一个节点。一共需要3个指针操作。

 

3 代码


  
  1. #include "iostream"
  2. #include "cstdlib"
  3. using namespace std;
  4. //问题:翻转链表
  5. typedef struct node
  6. {
  7. int m_nValue;
  8. node* m_pNext;
  9. }ListNode;
  10. void Print_list_node(ListNode* pHead);
  11. ListNode* Reverse_list(ListNode* pHead);
  12. void test01()
  13. {
  14. ListNode* pHead = NULL;
  15. ListNode* pNode1 = NULL;
  16. ListNode* pNode2 = NULL;
  17. ListNode* pNode3 = NULL;
  18. pHead = (ListNode*)malloc(sizeof(ListNode));
  19. pNode1 = (ListNode*)malloc(sizeof(ListNode));
  20. pNode2 = (ListNode*)malloc(sizeof(ListNode));
  21. pNode3 = (ListNode*)malloc(sizeof(ListNode));
  22. if (pHead == NULL || pNode1 == NULL || pNode2 == NULL || pNode3 == NULL)
  23. {
  24. cout << "malloc fail" << endl;
  25. return ;
  26. }
  27. pHead->m_nValue = 0;
  28. pHead->m_pNext = pNode1;
  29. pNode1->m_nValue = 1;
  30. pNode1->m_pNext = pNode2;
  31. pNode2->m_nValue = 2;
  32. pNode2->m_pNext = pNode3;
  33. pNode3->m_nValue = 3;
  34. pNode3->m_pNext = NULL;
  35. cout << "current list:";
  36. Print_list_node(pHead); //打印链表节点信息
  37. pHead = Reverse_list(pHead);
  38. cout << "reverse list:";
  39. Print_list_node(pHead); //反转后
  40. }
  41. int main(int argc, char const *argv[])
  42. {
  43. test01();
  44. return 0;
  45. }
  46. //功能:反转链表
  47. //输入:pHead链表头节点指针
  48. //返回:反转后的链表首节点指针
  49. ListNode* Reverse_list(ListNode* pHead)
  50. {
  51. //1.判断参数的有效性
  52. if (pHead == NULL)
  53. {
  54. return NULL;
  55. }
  56. ListNode* Reverse_pHead = NULL; //反转后的头节点指针
  57. ListNode* pNode = pHead; //当前节点指针
  58. ListNode* pPrev = NULL; //前一个节点指针
  59. while (pNode != NULL)
  60. {
  61. //1.保存后一个节点
  62. ListNode* pNext = pNode->m_pNext;
  63. //2.尾节点-->头节点
  64. if (pNext == NULL)
  65. {
  66. Reverse_pHead = pNode;
  67. }
  68. //3.改变当前节点指针的指向
  69. pNode->m_pNext = pPrev;
  70. //4.偏移指针 pPrev pNode
  71. pPrev = pNode;
  72. pNode = pNext;
  73. }
  74. return Reverse_pHead;
  75. }
  76. //功能:打印链表所有节点
  77. //输入:pHead 头节点地址
  78. //返回:无
  79. void Print_list_node(ListNode* pHead)
  80. {
  81. if (pHead != NULL)
  82. {
  83. while (pHead->m_pNext != NULL)
  84. {
  85. cout << pHead->m_nValue << ","; //打印节点信息
  86. pHead = pHead->m_pNext;
  87. }
  88. cout << pHead->m_nValue << endl; //打印尾节点
  89. }
  90. }

 

4 运行结果

文章来源: blog.csdn.net,作者:hinzer,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/feit2417/article/details/98758388

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。