【C/C++练习题】链表中倒数第k个结点

举报
王建峰 发表于 2021/11/19 02:15:09 2021/11/19
【摘要】 《剑指Offer》面试题22:链表中倒数第k个结点   1 题目 输入一个链表,输出该链表中倒数第k个结点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾结点是倒数第1个结点。例如一个链表有6个结点,从头结点开始它们的值依次是1、2、3、4、5、6。这个链表的倒数第3个结点是值为4的结点。   2 ...

《剑指Offer》面试题22:链表中倒数第k个结点

 


1 题目

输入一个链表,输出该链表中倒数第k个结点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾结点是倒数第1个结点。例如一个链表有6个结点,从头结点开始它们的值依次是1、2、3、4、5、6。这个链表的倒数第3个结点是值为4的结点。

 

2 分析

  1. 设置两个指针p1 p2指向链表头节点,
  2. 移动p2 (k-1)个长度,使得*p1相对*p2为"倒数第k个节点"
  3. 同时移动p1 p2 ,使p2指向尾节点,返回*p1

另外,还要考虑对特殊情况的处理,比如输入头节点指针为空、k小于等于0、k大于链表中节点的总个数。。

 

3 代码


  
  1. #include "iostream"
  2. #include "cstdlib"
  3. using namespace std;
  4. //问题:寻找链表中倒数第k个节点(从1开始计数)
  5. typedef struct node
  6. {
  7. int m_nValue;
  8. node* m_pNext;
  9. }ListNode;
  10. ListNode* Tail_to_find(ListNode* pHead, int k);
  11. void Print_list_node(ListNode* pHead);
  12. void test01()
  13. {
  14. ListNode* pHead = NULL;
  15. ListNode* pNode1 = NULL;
  16. ListNode* pNode2 = NULL;
  17. ListNode* pNode3 = NULL;
  18. ListNode* pThis = NULL;
  19. pHead = (ListNode*)malloc(sizeof(ListNode));
  20. pNode1 = (ListNode*)malloc(sizeof(ListNode));
  21. pNode2 = (ListNode*)malloc(sizeof(ListNode));
  22. pNode3 = (ListNode*)malloc(sizeof(ListNode));
  23. pThis = (ListNode*)malloc(sizeof(ListNode));
  24. if (pHead == NULL || pNode1 == NULL || pNode2 == NULL || pNode3 == NULL || pThis == NULL)
  25. {
  26. cout << "malloc fail" << endl;
  27. return ;
  28. }
  29. pHead->m_nValue = 0;
  30. pHead->m_pNext = pNode1;
  31. pNode1->m_nValue = 1;
  32. pNode1->m_pNext = pNode2;
  33. pNode2->m_nValue = 2;
  34. pNode2->m_pNext = pNode3;
  35. pNode3->m_nValue = 3;
  36. pNode3->m_pNext = NULL;
  37. cout << "list:";
  38. Print_list_node(pHead); //打印链表节点信息
  39. pThis = Tail_to_find(pHead, 1);
  40. if (pThis != NULL)
  41. cout << "k = 1, value = " << pThis->m_nValue << endl;
  42. else
  43. cout << "k = 1, input error" << endl;
  44. pThis = Tail_to_find(pHead, 2);
  45. if (pThis != NULL)
  46. cout << "k = 2, value = " << pThis->m_nValue << endl;
  47. else
  48. cout << "k = 2, input error" << endl;
  49. pThis = Tail_to_find(pHead, 4);
  50. if (pThis != NULL)
  51. cout << "k = 4, value = " << pThis->m_nValue << endl;
  52. else
  53. cout << "k = 4, input error" << endl;
  54. pThis = Tail_to_find(pHead, 0);
  55. if (pThis != NULL)
  56. cout << "k = 0, value = " << pThis->m_nValue << endl;
  57. else
  58. cout << "k = 0, input error" << endl;
  59. pThis = Tail_to_find(pHead, 100);
  60. if (pThis != NULL)
  61. cout << "k = 100, value = " << pThis->m_nValue << endl;
  62. else
  63. cout << "k = 100, input error" << endl;
  64. }
  65. int main(int argc, char const *argv[])
  66. {
  67. test01();
  68. return 0;
  69. }
  70. //功能:反向查找链表
  71. //输入:pHead 首节点指针, k 节点总数
  72. //返回:链表中倒数第k个节点的指针
  73. ListNode* Tail_to_find(ListNode* pHead, int k)
  74. {
  75. //1.输入参数的合法性
  76. if ((NULL == pHead) || (k <= 0))
  77. {
  78. return NULL;
  79. }
  80. //2.使p1指向第1个节点,p2指向第k个节点
  81. ListNode* p1 = pHead;
  82. ListNode* p2 = pHead;
  83. for (int i = 0;i < k-1;i++)
  84. {
  85. if (p2->m_pNext != NULL)
  86. {//没有达到尾部
  87. p2 = p2->m_pNext;
  88. }
  89. else
  90. {//特殊情况:k大于链表中节点总数
  91. return NULL;
  92. }
  93. }
  94. //3.同时移动p1 p2,使p2指向尾节点
  95. while (p2->m_pNext != NULL)
  96. {
  97. p1 = p1->m_pNext;
  98. p2 = p2->m_pNext;
  99. }
  100. //4.返回p1指针
  101. return p1;
  102. }
  103. //功能:打印链表所有节点
  104. //输入:pHead 头节点地址
  105. //返回:无
  106. void Print_list_node(ListNode* pHead)
  107. {
  108. if (pHead != NULL)
  109. {
  110. while (pHead->m_pNext != NULL)
  111. {
  112. cout << pHead->m_nValue << ","; //打印节点信息
  113. pHead = pHead->m_pNext;
  114. }
  115. cout << pHead->m_nValue << endl; //打印尾节点
  116. }
  117. }

 

4 运行结果

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

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

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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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