单链表的简单面试题

[cpp]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. <pre class="cpp" name="code">#define _CRT_SECURE_NO_WARNINGS 1  
  2. #include "SListNode.h"  
  3.   
  4. void Test1()//PushBack   PopBack  
  5. {  
  6.     PSListNode pHead = NULL;  
  7.     InitList(&pHead);  
  8.     PushBack(&pHead,0);  
  9.     PushBack(&pHead,1);  
  10.     PushBack(&pHead,2);  
  11.     PushBack(&pHead,3);  
  12.     PushBack(&pHead,4);  
  13.   
  14.     PrintList(&pHead);  
  15.   
  16.     PopBack(&pHead);  
  17.     PopBack(&pHead);  
  18.   
  19.     PrintList(&pHead);  
  20. }  
  21.   
  22. void Test2()//PushFront   PopFront   Find  
  23. {   
  24.     PSListNode ret = NULL;  
  25.     PSListNode pHead = NULL;  
  26.     InitList(&pHead);  
  27.     PushFront(&pHead,0);  
  28.     PushFront(&pHead,1);  
  29.     PushFront(&pHead,2);  
  30.     PushFront(&pHead,3);  
  31.     PushFront(&pHead,4);  
  32.   
  33.     PrintList(&pHead);  
  34.   
  35.     PopFront(&pHead);  
  36.     PopFront(&pHead);  
  37.     //PopFront(&pHead);  
  38.     //PopFront(&pHead);  
  39.     //PopFront(&pHead);  
  40.     //PopFront(&pHead);  
  41.   
  42.     PrintList(&pHead);  
  43.   
  44.     ret = Find(&pHead,2);  
  45.     if (ret == NULL)  
  46.     {  
  47.         printf("no find\n");  
  48.     }   
  49.     else  
  50.     {  
  51.         printf("%d \n",ret->data);  
  52.     }  
  53. }  
  54.   
  55. void Test3()//Erase  
  56. {  
  57.     PSListNode pHead = NULL;  
  58.     InitList(&pHead);  
  59.     PushBack(&pHead,0);  
  60.     PushBack(&pHead,1);  
  61.     PushBack(&pHead,2);  
  62.     PushBack(&pHead,3);  
  63.     PushBack(&pHead,4);  
  64.     PrintList(&pHead);  
  65.   
  66.     //Erase(&pHead,Find(&pHead,2));  
  67.     Erase(&pHead,Find(&pHead,4));  
  68.     //Erase(&pHead,Find(&pHead,0));  
  69.     PrintList(&pHead);  
  70.   
  71.     Insert(&pHead,Find(&pHead,2),8);  
  72.     Insert(&pHead,Find(&pHead,0),9);  
  73.     PrintList(&pHead);  
  74.   
  75.     DestroyList(&pHead);  
  76.     PrintList(&pHead);  
  77. }  
  78.   
  79. void Test4()//BubblingSort   EraseNotHead  ReverseLish  InsertFrontNode  
  80. {  
  81.     PSListNode ret = NULL;  
  82.     PSListNode pHead = NULL;  
  83.     InitList(&pHead);  
  84.     PushBack(&pHead,9);  
  85.     PushBack(&pHead,1);  
  86.     PushBack(&pHead,8);  
  87.     PushBack(&pHead,3);  
  88.     PushBack(&pHead,6);  
  89.     PrintList(&pHead);  
  90.   
  91.     BubblingSort(&pHead);  
  92.     PrintList(&pHead);  
  93.   
  94.     EraseNotHead(Find(&pHead,8));  
  95.     PrintList(&pHead);  
  96.   
  97.     ReverseLish(&pHead);  
  98.     PrintList(&pHead);  
  99.   
  100.     InsertFrontNode(Find(&pHead,3),15);  
  101.     PrintList(&pHead);  
  102.   
  103.     ret = FindMidNode(&pHead);  
  104.     printf("%d\n",ret->data);  
  105.   
  106.     DelKNode(&pHead,3);  
  107.     PrintList(&pHead);  
  108.   
  109.     DestroyList(&pHead);  
  110.     PrintList(&pHead);  
  111.   
  112. }  
  113. int main()  
  114. {  
  115.     //Test1();  
  116.     //Test2();  
  117.     //Test3();  
  118.     Test4();  
  119.     system("pause");  
  120.     return 0;  
  121. }  


 
 

 

 

 

 

[cpp]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. #ifndef __SListNode_H__  
  2. #define __SListNode_H__  
  3. #pragma once  //能够保证头文件只被编译一次  
  4. #include <stdio.h>  
  5. #include <stdlib.h>  
  6. #include <assert.h>  
  7. typedef int DataType;  
  8.   
  9. typedef struct SListNode   
  10. {  
  11.     DataType data;  
  12.     struct SListNode *_NextNode;  
  13. }SListNode,*PSListNode;  
  14.   
  15. // 初始化单链表(对于无头结点单链表,该函数没有意义)  
  16. void InitList(PSListNode* pHead);  
  17. // 销毁单链表  
  18. void DestroyList(PSListNode* pHead);  
  19. // 尾插  
  20. void PushBack(PSListNode* pHead, DataType data);  
  21. // 尾出  
  22. void PopBack(PSListNode* pHead);  
  23. // 头插  
  24. void PushFront(PSListNode* pHead, DataType data);  
  25. // 头出  
  26. void PopFront(PSListNode* pHead);  
  27. // 在链表中查找元素data  
  28. PSListNode Find(PSListNode* pHead, DataType data);  
  29. // 删除pos位置的结点(注意不能用那种替换形式)  
  30. void  Erase(PSListNode* pHead, PSListNode pos);  
  31. // 在链表的pos位置插入元素data  
  32. void  Insert(PSListNode* pHead, PSListNode pos, DataType data);  
  33. //打印链表存放的数据  
  34. void PrintList(PSListNode* pHead);  
  35. //写一个单链表的冒泡排序  
  36. void BubblingSort(PSListNode* pHead);  
  37. //删除一个无头链表的非尾结点  
  38. void EraseNotHead(PSListNode pos);  
  39. //反转(逆置)链表  
  40. void ReverseLish(PSListNode* pHead);  
  41. //(无头单链表)在当前节点前插入一个节点  
  42. void InsertFrontNode(PSListNode pos,DataType data);  
  43. //只遍历一遍,查找链表的中间结点  
  44. PSListNode FindMidNode(PSListNode* pHead);  
  45. //删除倒数第k个结点(k>1 && k<总长度)  
  46. void DelKNode(PSListNode* pHead,int k);  
  47.   
  48. #endif//__SListNode_H__  


 

 

[cpp]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. #define _CRT_SECURE_NO_WARNINGS 1  
  2. #include "SListNode.h"  
  3.   
  4. //这里参的是二级指针,因为要对结构体指针的内容进行修改,所以必须传该指针的地址(即  
  5. //一个二级指针),一级指针相当于值传递,不会对实参有改变  
  6.   
  7. void InitList(PSListNode* pHead)  
  8. {  
  9.     assert(pHead);  
  10.     pHead = NULL;  
  11. }  
  12.   
  13. PSListNode ByeNode(DataType data)  
  14. {  
  15.     PSListNode pNewNode = (PSListNode)malloc(sizeof(struct SListNode));  
  16.     if (pNewNode != NULL)  
  17.     {  
  18.         pNewNode->data = data;  
  19.         pNewNode->_NextNode = NULL;//一定要记得把新开辟结点的下一个结点赋值为空  
  20.     }   
  21.     else  
  22.     {  
  23.         printf("开辟内存失败\n");  
  24.     }  
  25.   
  26.     return pNewNode;  
  27. }  
  28.   
  29. void PrintList(PSListNode* pHead)  
  30. {  
  31.     PSListNode pNode = NULL;  
  32.     assert(pHead);  
  33.     if (*pHead == NULL)  
  34.     {  
  35.         return;  
  36.     }   
  37.     else  
  38.     {  
  39.         pNode = *pHead;  
  40.   
  41.         while (NULL != pNode)//最好写成while(NULL != pNode)  
  42.         {  
  43.             printf("%d ",pNode->data);  
  44.             pNode = pNode->_NextNode;  
  45.         }  
  46.         printf("\n");  
  47.     }  
  48. }  
  49.   
  50. void PushBack(PSListNode* pHead, DataType data)  
  51. {  
  52.     PSListNode pNode = NULL;  
  53.     PSListNode pNewNode = NULL;  
  54.     assert(pHead);  
  55.     if (*pHead == NULL)  
  56.     {  
  57.         *pHead = ByeNode(data);  
  58.     }   
  59.     else  
  60.     {  
  61.         pNode = *pHead;  
  62.   
  63.         //找到尾结点  
  64.         while (NULL != pNode->_NextNode)  
  65.         {  
  66.             //保存尾结点  
  67.             pNode = pNode->_NextNode;  
  68.         }  
  69.   
  70.         pNewNode = ByeNode(data);  
  71.         pNode->_NextNode = pNewNode;  
  72.         pNewNode->_NextNode = NULL;  
  73.     }  
  74. }  
  75.   
  76. void PopBack(PSListNode* pHead)  
  77. {  
  78.     PSListNode pNode1 = NULL;     
  79.     PSListNode pNode2 = NULL;  
  80.     assert(pHead);  
  81.     pNode1 = *pHead;  
  82.   
  83.     if (*pHead == NULL)  
  84.     {  
  85.         printf("SListNode is emtpy\n");  
  86.         return;  
  87.     }   
  88.     else if (pNode1->_NextNode == NULL) //当只剩下一个节点的情况下,要单独处理头指针  
  89.     {  
  90.         *pHead = NULL;  
  91.         free(pNode1);  
  92.         pNode1 = NULL;  
  93.     }  
  94.     else  
  95.     {  
  96.         while (pNode1->_NextNode != NULL)  
  97.         {  
  98.             pNode2 = pNode1;//用一个指针追踪当前指针,一遍记录当前位置  
  99.             pNode1 = pNode1->_NextNode;  
  100.         }  
  101.   
  102.         pNode2->_NextNode = NULL;//保证链表最后一个节点的的_NextNode为空  
  103.   
  104.         free(pNode1);//和malloc配套使用   释放最后一个节点  
  105.         pNode1 = NULL;//将释放掉的结点赋值为空,以防变成空指针  
  106.     }  
  107. }  
  108.   
  109. void PushFront(PSListNode* pHead, DataType data)  
  110. {  
  111.     PSListNode pNode = NULL;  
  112.     assert(pHead);  
  113.   
  114.     if (*pHead == NULL)  
  115.     {  
  116.         *pHead = ByeNode(data);  
  117.         (*pHead)->_NextNode = NULL;  
  118.     }   
  119.     else  
  120.     {  
  121.         pNode = ByeNode(data);  
  122.         pNode->_NextNode = *pHead;  
  123.         *pHead = pNode;  
  124.     }  
  125. }  
  126.   
  127. void PopFront(PSListNode* pHead)  
  128. {  
  129.     PSListNode pNode = NULL;  
  130.     assert(pHead);  
  131.   
  132.       
  133.     if (NULL == *pHead)  
  134.     {  
  135.         printf("SListNode is empty\n");  
  136.     }   
  137.     else if ((*pHead)->_NextNode == NULL)  
  138.     {  
  139.         pNode = *pHead;  
  140.         *pHead = NULL;  
  141.         free(pNode);  
  142.         pNode = NULL;  
  143.     }  
  144.     else  
  145.     {  
  146.         pNode = *pHead;  
  147.         *pHead = (*pHead)->_NextNode;  
  148.         free(pNode);  
  149.         pNode = NULL;  
  150.     }  
  151. }  
  152.   
  153. PSListNode Find(PSListNode* pHead, DataType data)  
  154. {  
  155.     PSListNode pNode = NULL;  
  156.     assert(pHead);  
  157.   
  158.     pNode = *pHead;  
  159.     while (NULL != pNode)  
  160.     {  
  161.         if (pNode->data == data)  
  162.         {  
  163.             return pNode;  
  164.         }   
  165.         else  
  166.         {  
  167.             pNode = pNode->_NextNode;  
  168.         }  
  169.     }  
  170.   
  171.     return NULL;  
  172. }  
  173.   
  174. void Erase(PSListNode* pHead, PSListNode pos)  
  175. {  
  176.     PSListNode pNode = NULL;  
  177.     PSListNode pNode2 = NULL;  
  178.     assert(pHead);  
  179.     assert(pos);  
  180.   
  181.     pNode = *pHead;  
  182.   
  183.     while (NULL != pNode)  
  184.     {  
  185.         if (pNode->_NextNode == pos )  
  186.         {  
  187.             pNode2 = pNode->_NextNode;  
  188.             pNode->_NextNode = pNode->_NextNode->_NextNode;  
  189.             free(pNode2);  
  190.             pNode2 = NULL;  
  191.         }   
  192.         else if(pNode == pos)  
  193.         {  
  194.             *pHead = (*pHead)->_NextNode;  
  195.             free(pNode);  
  196.             pNode = NULL;  
  197.         }  
  198.         else  
  199.         {  
  200.             pNode = pNode->_NextNode;  
  201.         }  
  202.     }  
  203. }  
  204.   
  205. void Insert(PSListNode* pHead, PSListNode pos, DataType data)  
  206. {  
  207.     PSListNode pNode = NULL;  
  208.     PSListNode pNewNode = NULL;  
  209.     assert(pHead);  
  210.     assert(pos);  
  211.   
  212.     pNode = *pHead;  
  213.   
  214.     while (NULL != pNode)  
  215.     {  
  216.         if (pNode->_NextNode == pos)  
  217.         {  
  218.             pNewNode = ByeNode(data);  
  219.             pNewNode->_NextNode = pNode->_NextNode;  
  220.             pNode->_NextNode = pNewNode;  
  221.             break;  
  222.         }   
  223.         else if(pNode == pos)  
  224.         {  
  225.             pNewNode = ByeNode(data);  
  226.             pNewNode->_NextNode = *pHead;  
  227.             *pHead = pNewNode;  
  228.             break;  
  229.         }  
  230.         else  
  231.         {  
  232.             pNode = pNode->_NextNode;  
  233.         }  
  234.     }  
  235. }  
  236.   
  237. void DestroyList(PSListNode* pHead)  
  238. {  
  239.     PSListNode pNode = NULL;  
  240.     PSListNode pNode2 = NULL;  
  241.     assert(pHead);  
  242.   
  243.     pNode = *pHead;  
  244.   
  245.     while (NULL != pNode)  
  246.     {  
  247.         pNode2 = pNode;  
  248.         pNode = pNode->_NextNode;  
  249.         free(pNode2);  
  250.         pNode2 = NULL;  
  251.     }  
  252.     *pHead = NULL;  
  253. }  
  254.   
  255. void BubblingSort(PSListNode* pHead)  
  256. {  
  257.     PSListNode cur = NULL;  
  258.     PSListNode prev = NULL;  
  259.     DataType tmp = 0;  
  260.     assert(pHead);  
  261.   
  262.     cur = *pHead;  
  263.   
  264.     while (cur != prev)  
  265.     {  
  266.         while (cur->_NextNode != prev)  
  267.         {  
  268.             if (cur->data > cur->_NextNode->data)  
  269.             {  
  270.                 tmp = cur->data;  
  271.                 cur->data = cur->_NextNode->data;  
  272.                 cur->_NextNode->data = tmp;  
  273.             }  
  274.             cur = cur->_NextNode;  
  275.         }  
  276.         prev = cur;  
  277.         cur = *pHead;  
  278.     }  
  279. }  
  280.   
  281. void EraseNotHead(PSListNode pos)  
  282. {  
  283.     PSListNode Del = NULL;  
  284.     assert(pos->_NextNode != NULL);  
  285.     if (pos == NULL)  
  286.     {  
  287.         return;  
  288.     }  
  289.   
  290.     pos->data = pos->_NextNode->data;  
  291.   
  292.     Del = pos->_NextNode;  
  293.     pos->_NextNode = pos->_NextNode->_NextNode;  
  294.     free(Del);  
  295.     Del = NULL;  
  296. }  
  297.   
  298.   
  299. void ReverseLish(PSListNode* pHead)  
  300. {  
  301.     PSListNode cur = NULL;  
  302.     PSListNode NewpHead = NULL;  
  303.     assert(pHead);  
  304.   
  305.     while((*pHead)->_NextNode != NULL)  
  306.     {  
  307.         NewpHead = *pHead;  
  308.         *pHead = (*pHead)->_NextNode;  
  309.         NewpHead->_NextNode = cur;  
  310.         cur = NewpHead;  
  311.     }  
  312.   
  313.     (*pHead)->_NextNode = NewpHead;  
  314. }  
  315.   
  316. void InsertFrontNode(PSListNode pos,DataType data)  
  317. {  
  318.     DataType tmp = 0;  
  319.     PSListNode pNewNode = NULL;  
  320.     if (pos == NULL)  
  321.     {  
  322.         return;  
  323.     }  
  324.     pNewNode = ByeNode(data);  
  325.   
  326.     tmp = pNewNode->data;  
  327.     pNewNode->data = pos->data;  
  328.     pos->data = tmp;  
  329.   
  330.     pNewNode->_NextNode = pos->_NextNode;  
  331.     pos->_NextNode = pNewNode;  
  332. }  
  333.   
  334.   
  335. PSListNode FindMidNode(PSListNode* pHead)  
  336. {  
  337.     PSListNode cur = NULL;  
  338.     PSListNode prev = NULL;  
  339.     PSListNode pNode = NULL;  
  340.     assert(pHead);  
  341.   
  342.     pNode = *pHead;  
  343.     cur = pNode;  
  344.     prev = pNode;  
  345.   
  346.     while (prev->_NextNode != NULL && prev->_NextNode->_NextNode != NULL)  
  347.     {  
  348.         cur = pNode->_NextNode;  
  349.         prev = pNode->_NextNode->_NextNode;  
  350.         pNode = pNode->_NextNode;  
  351.     }  
  352.   
  353.     return cur;  
  354. }  
  355.   
  356. void DelKNode(PSListNode* pHead,int k)  
  357. {  
  358.     PSListNode cur = NULL;  
  359.     PSListNode prev = NULL;  
  360.     PSListNode pNode = NULL;  
  361.     PSListNode Del = NULL;  
  362.     assert(pHead);  
  363.     assert(k > 1);  
  364.     pNode = *pHead;  
  365.     cur = pNode;  
  366.     prev = pNode;  
  367.   
  368.     while (k--)//使prev指向需要删除结点的前一个结点  
  369.     {  
  370.         cur = cur->_NextNode;  
  371.     }  
  372.     while (cur->_NextNode != NULL)  
  373.     {  
  374.         cur = cur->_NextNode;  
  375.         prev = prev->_NextNode;  
  376.     }  
  377.   
  378.     Del = prev->_NextNode;  
  379.     prev->_NextNode = prev->_NextNode->_NextNode;  
  380.     free(Del);  
  381.     Del = NULL;  
  382. }  



 

 

深度学习是机器学习的一个子领域,它基于人工神经网络的研究,特别是利用多层次的神经网络来进行学习和模式识别。深度学习模型能够学习数据的高层次特征,这些特征对于图像和语音识别、自然语言处理、医学图像分析等应用至关重要。以下是深度学习的一些关键概念和组成部分: 1. **神经网络(Neural Networks)**:深度学习的基础是人工神经网络,它是由多个层组成的网络结构,包括输入层、隐藏层和输出层。每个层由多个神经元组成,神经元之间通过权重连接。 2. **前馈神经网络(Feedforward Neural Networks)**:这是最常见的神经网络类型,信息从输入层流向隐藏层,最终到达输出层。 3. **卷积神经网络(Convolutional Neural Networks, CNNs)**:这种网络特别适合处理具有网格结构的数据,如图像。它们使用卷积层来提取图像的特征。 4. **循环神经网络(Recurrent Neural Networks, RNNs)**:这种网络能够处理序列数据,如时间序列或自然语言,因为它们具有记忆功能,能够捕捉数据中的时间依赖性。 5. **长短期记忆网络(Long Short-Term Memory, LSTM)**:LSTM 是一种特殊的 RNN,它能够学习长期依赖关系,非常适合复杂的序列预测任务。 6. **生成对抗网络(Generative Adversarial Networks, GANs)**:由两个网络组成,一个生成器和一个判别器,它们相互竞争,生成器生成数据,判别器评估数据的真实性。 7. **深度学习框架**:如 TensorFlow、Keras、PyTorch 等,这些框架提供了构建、训练和部署深度学习模型的工具和库。 8. **激活函数(Activation Functions)**:如 ReLU、Sigmoid、Tanh 等,它们在神经网络中用于添加非线性,使得网络能够学习复杂的函数。 9. **损失函数(Loss Functions)**:用于评估模型的预测与真实值之间的差异,常见的损失函数包括均方误差(MSE)、交叉熵(Cross-Entropy)等。 10. **优化算法(Optimization Algorithms)**:如梯度下降(Gradient Descent)、随机梯度下降(SGD)、Adam 等,用于更新网络权重,以最小化损失函数。 11. **正则化(Regularization)**:技术如 Dropout、L1/L2 正则化等,用于防止模型过拟合。 12. **迁移学习(Transfer Learning)**:利用在一个任务上训练好的模型来提高另一个相关任务的性能。 深度学习在许多领域都取得了显著的成就,但它也面临着一些挑战,如对大量数据的依赖、模型的解释性差、计算资源消耗大等。研究人员正在不断探索新的方法来解决这些问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值