找到链表的倒数第m个节点

来源:互联网 发布:百雀羚网络推广策划案 编辑:程序博客网 时间:2024/05/17 13:13

设计一个算法,找到链表的倒数第m个元素,假设最后一个元素为倒数第0个。算法的复杂度为n。

方法一:遍历链表,得到链表的长度,再找到链表的第n-m个元素即可(如果链表的长度知道就直接找第n-m个元素)。

方法二:双指针查找。用两个指针p1、p2,开始都指向头节点。p1先移动,当p1和p2的距离为m时,两个指针一起移动,当p1移动到尾节点时,此时p2指向的节点就是要找的节点。

具体代码:

[cpp] view plaincopyprint?
  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3. typedef struct Node   
  4. {  
  5.     int data;  
  6.     Node* pNext;  
  7. }*pNode;  
  8.   
  9. pNode InitNode()  
  10. {  
  11.     pNode pHead=(pNode)malloc(sizeof(Node));  
  12.     pHead->pNext=NULL;  
  13.     return pHead;  
  14. }  
  15.   
  16. void CreateListNode(pNode pHead,int nodeNum)  
  17. {  
  18.     pNode pTail=pHead;  
  19.     for (int i=0;i<nodeNum;i++)  
  20.     {  
  21.         pNode pCur=(pNode)malloc(sizeof(Node));  
  22.         pCur->data=i+1;  
  23.         pTail->pNext=pCur;  
  24.         pCur->pNext=NULL;  
  25.         pTail=pCur;  
  26.     }  
  27. }  
  28.   
  29. void ShowNodeData(pNode pHead)  
  30. {  
  31.     while(pHead->pNext)  
  32.     {  
  33.         printf("%d\n",pHead->pNext->data);  
  34.         pHead=pHead->pNext;  
  35.     }  
  36. }  
  37.   
  38.   
  39. //找到链表的第m个元素  
  40. int GetTheData(pNode pHead,int m)  
  41. {  
  42.     int i=0;  
  43.     pNode pTail=pHead;  
  44.     while (pTail->pNext)  
  45.     {  
  46.         i++;  
  47.         if (i==m)  
  48.         {  
  49.             return pTail->pNext->data;  
  50.         }  
  51.         pTail=pTail->pNext;  
  52.     }  
  53.   
  54. }  
  55.   
  56. //第一种方法  
  57. int GetTheDataByOne(pNode pHead,int m)  
  58. {  
  59.     int n=0;  
  60.     pNode pCur=pHead;  
  61.     while (pCur->pNext)  
  62.     {  
  63.         n++; //先得到链表的长度  
  64.         pCur=pCur->pNext;  
  65.     }  
  66.     return GetTheData(pHead,n-m);  
  67. }  
  68.   
  69. //第二种方法  
  70. int GetTheDataBySecond(pNode pHead,int m)  
  71. {  
  72.     pNode pFirst=pHead,pSecond=pHead;  
  73.     int instance=0;  
  74.     while (pFirst->pNext!=NULL) //p1移动到最后一个节点时,循环结束  
  75.     {  
  76.         if (instance==m)    
  77.         {  
  78.              pFirst=pFirst->pNext;  
  79.              pSecond=pSecond->pNext;  
  80.         }  
  81.         else  
  82.         {  
  83.             pFirst=pFirst->pNext;  
  84.             instance++;  
  85.         }  
  86.     }  
  87.     return pSecond->data;  
  88. }  
  89.   
  90. int _tmain(int argc, _TCHAR* argv[])  
  91. {  
  92.     Node*pHead=InitNode();  
  93.     CreateListNode(pHead,8);  
  94.     ShowNodeData(pHead);  
  95.     printf("输入倒数第几个元素");  
  96.     int iNum=0;  
  97.     scanf("%d",&iNum);  
  98.     printf("方法一的结果是:%d\n",GetTheDataByOne(pHead,iNum));  
  99.     printf("方法二的结果是:%d\n",GetTheDataBySecond(pHead,iNum));  
  100.     return 0;  
  101. }  



0 0