Chinaunix首页 | 论坛 | 博客
  • 博客访问: 337258
  • 博文数量: 100
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 521
  • 用 户 组: 普通用户
  • 注册时间: 2014-10-31 11:37
个人简介

活到老,学到老

文章分类

全部博文(100)

文章存档

2018年(1)

2017年(2)

2016年(11)

2015年(82)

2014年(4)

我的朋友

分类: C/C++

2015-07-23 14:45:40


点击(此处)折叠或打开

  1. #include<iostream>
  2. #include<stdlib.h>
  3. #include<stack>
  4. using namespace std;

  5. //链表结构
  6. struct ListNode
  7. {
  8.     int m_nValue;
  9.     ListNode* m_pNext;
  10. };

  11. //创建一个链表结点
  12. ListNode* CreateListNode(int value)
  13. {
  14.     ListNode *pNode=new ListNode();
  15.     pNode->m_nValue=value;
  16.     pNode->m_pNext=NULL;
  17.     return pNode;

  18. }

  19. //遍历链表中的所有结点
  20. void PrintList(ListNode* pHead)
  21. {
  22.     ListNode *pNode=pHead;
  23.     while(pNode!=NULL)
  24.     {
  25.         cout<<pNode->m_nValue<<" ";
  26.         pNode=pNode->m_pNext;
  27.     }
  28.     cout<<endl;
  29. }

  30. //往链表末尾添加结点
  31. void AddToTail(ListNode** pHead,int value)
  32. {
  33.     ListNode* pNew=new ListNode();
  34.     pNew->m_nValue=value;
  35.     pNew->m_pNext=NULL;

  36.     if(*pHead==NULL)
  37.     {
  38.         *pHead=pNew;
  39.     }
  40.     else
  41.     {
  42.         ListNode* pNode=*pHead;
  43.         while(pNode->m_pNext!=NULL)
  44.             pNode=pNode->m_pNext;
  45.         pNode->m_pNext=pNew;
  46.     }

  47. }
  48. //非递归翻转
  49. ListNode* ReverseList(ListNode* pHead)
  50. {
  51.     ListNode* pNode=pHead;//当前结点
  52.     ListNode* pPrev=NULL;//当前结点的前一个结点
  53.     ListNode* pReversedHead=NULL;//反转链表头结点
  54.     while(pNode!=NULL)
  55.     {
  56.         ListNode* pNext=pNode->m_pNext;
  57.         if(pNext==NULL)//如果当前结点的下一个结点为空,那么反转链表的头结点就是当前结点。
  58.             pReversedHead=pNode;

  59.         pNode->m_pNext=pPrev;//当前结点指向前一个结点

  60.         pPrev=pNode;//pPrev和pNode往前移动。
  61.         pNode=pNext;//这里要使用前面保存下来的pNext,不能使用pNode->m_pNext
  62.     }
  63.     return pReversedHead;//返回反转链表头指针。
  64. }

  65. //递归翻转
  66. ListNode * ReverseList2(ListNode * head)
  67. {
  68.     //如果链表为空或者链表中只有一个元素
  69.     if(head==NULL || head->m_pNext==NULL)
  70.         return head;
  71.     else
  72.     {
  73.        ListNode * newhead=ReverseList2(head->m_pNext);//先反转后面的链表
  74.        head->m_pNext->m_pNext=head;//再将当前节点设置为其然来后面节点的后续节点
  75.        head->m_pNext=NULL;
  76.        return newhead;
  77.     }
  78. }
  79. //合并两个有序链表
  80. ListNode *MergeList(ListNode *phead1,ListNode *phead2)
  81. {
  82.     ListNode *phead=NULL;
  83.     ListNode *ptemphead=NULL;

  84.     if(phead1==NULL || phead2==NULL)
  85.     {
  86.         return NULL;
  87.     }
  88.     if(phead1->m_nValue < phead2->m_nValue)
  89.     {
  90.         phead=phead1;
  91.         phead1=phead1->m_pNext;
  92.     }
  93.     else
  94.     {
  95.         phead=phead2;
  96.         phead2=phead2->m_pNext;
  97.     }
  98.     ptemphead=phead;
  99.     while(phead1 && phead2)
  100.     {
  101.         if(phead1->m_nValue < phead2->m_nValue)
  102.         {
  103.             phead->m_pNext=phead1;
  104.             phead1=phead1->m_pNext;
  105.         }
  106.         else
  107.         {
  108.             phead->m_pNext=phead2;
  109.             phead2=phead2->m_pNext;
  110.         }
  111.         phead=phead->m_pNext;
  112.     }
  113.     if(phead1)
  114.     {
  115.         phead->m_pNext=phead1;
  116.     }
  117.     if(phead2)
  118.     {
  119.         phead->m_pNext=phead2;
  120.     }
  121.     return ptemphead;
  122. }

  123.  // 查找单链表中倒数第K个结点
  124. ListNode * RGetKthNode(ListNode * pHead, unsigned int k)
  125. {
  126.     ListNode *ptemphead=pHead;
  127.     if(pHead ==NULL || k==0)
  128.         return NULL;
  129.     while(pHead && k)
  130.     {
  131.         pHead=pHead->m_pNext;
  132.         k--;
  133.     }
  134.     while(pHead)
  135.     {
  136.         pHead=pHead->m_pNext;
  137.         ptemphead=ptemphead->m_pNext;
  138.     }
  139.     return ptemphead;
  140. }
  141. // 获取单链表中间结点,若链表长度为n(n>0),则返回第n/2+1个结点
  142. ListNode * GetMiddleNode(ListNode * pHead)
  143. {
  144.     ListNode *p1=pHead;
  145.     ListNode *p2=pHead;

  146.     if(pHead==NULL || pHead->m_pNext==NULL)
  147.         return pHead;
  148.     while(p1->m_pNext && p2->m_pNext)
  149.     {
  150.         p1=p1->m_pNext;
  151.         p2=p2->m_pNext;
  152.         if(p2->m_pNext)
  153.             p2=p2->m_pNext;
  154.     }
  155.     return p1;
  156. }
  157. //判断是否有环
  158. bool HasCircle(ListNode * pHead)
  159. {
  160.     ListNode *p1=pHead;
  161.     ListNode *p2=pHead;

  162.     if(pHead==NULL)
  163.         return -1;
  164.     while(p2->m_pNext)
  165.     {
  166.         p1=p1->m_pNext;
  167.         p2=p2->m_pNext;
  168.         if(p2->m_pNext)
  169.             p2=p2->m_pNext;

  170.         if(p1==p2)
  171.             return true;
  172.     }
  173.     return false;
  174. }
  175. // 从尾到头打印链表,使用递归
  176. void RPrintList(ListNode * pHead)
  177. {
  178.     if(pHead==NULL)
  179.     {
  180.         return;
  181.     }
  182.     else
  183.     {
  184.         RPrintList(pHead->m_pNext);
  185.         cout<<pHead->m_nValue<<" ";
  186.     }
  187. }
  188. //判断链表是否相交。如果两个链表相交于某一节点,那么在这个相交节点之后的所有节点都是两个链表所共有的。判断最后一个节点是否相同
  189. bool IsIntersected(ListNode * pHead1, ListNode * pHead2)
  190. {
  191.     ListNode *p1=pHead1;
  192.     ListNode *p2=pHead2;

  193.     while(p1->m_pNext)
  194.         p1=p1->m_pNext;
  195.     while(p2->m_pNext)
  196.         p2=p2->m_pNext;
  197.         return p1==p2;
  198. }
  199. //两个单链表相交的第一个节点
  200. //对第一个链表遍历,计算长度len1,同时保存最后一个节点的地址。
  201. //对第二个链表遍历,计算长度len2,同时检查最后一个节点是否和第一个链表的最后一个节点相同,若不相同,不相交,结束。
  202. //两个链表均从头节点开始,假设len1大于len2,那么将第一个链表先遍历len1-len2个节点,此时两个链表当前节点到第一个相交节点的距离就相等了,然后一起向后遍历,知道两个节点的地址相同。//
  203. ListNode* GetFirstCommonNode(ListNode * pHead1, ListNode * pHead2)
  204. {
  205.     if(pHead1==NULL || pHead2==NULL)
  206.         return NULL;
  207.     int len1,len2;
  208.     int k;
  209.     ListNode *p1=pHead1;
  210.     ListNode *p2=pHead2;
  211.     ListNode *p11=pHead1;
  212.     ListNode *p22=pHead2;
  213.     while(p1->m_pNext)
  214.     {
  215.         p1=p1->m_pNext;
  216.         len1++;
  217.     }
  218.     while(p2->m_pNext)
  219.     {
  220.         p2=p2->m_pNext;
  221.         len2++;
  222.     }

  223.     if(p1!=p2)
  224.         return NULL;
  225.     if(len1>len2)
  226.     {
  227.         k=len1-len2;
  228.         while(k--)
  229.             p11=p11->m_pNext;
  230.     }
  231.     else
  232.     {
  233.         k=len2-len1;
  234.         while(k--)
  235.             p22=p22->m_pNext;
  236.     }
  237.     if(p11!=p22)
  238.     {
  239.         p11=p11->m_pNext;
  240.         p22=p22->m_pNext;
  241.     }
  242.     return p11;
  243. }
  244. //测试程序
  245. int main(int argc,char **argv)
  246. {
  247.     //创建结点
  248.     ListNode* pNode1=CreateListNode(1);//创建一个结点
  249.     ListNode *pNode2=CreateListNode(2);
  250.     ListNode *pNode=NULL;
  251.     ListNode *ptmepNode=NULL;
  252.     //PrintList(pNode1);//打印
  253.     //往链表中添加新结点
  254.     AddToTail(&pNode1,3);//为链表添加一个结点
  255.     AddToTail(&pNode1,6);//为链表添加一个结点
  256.     AddToTail(&pNode1,7);//为链表添加一个结点
  257.     AddToTail(&pNode1,8);//为链表添加一个结点

  258.     AddToTail(&pNode2,4);//为链表添加一个结点
  259.     AddToTail(&pNode2,7);//为链表添加一个结点
  260.     AddToTail(&pNode2,8);//为链表添加一个结点
  261.     AddToTail(&pNode2,10);//为链表添加一个结点
  262.     //打印链表
  263.     //PrintList(pNode1);//打印
  264.     //PrintList(pNode2);

  265.     //反转链表
  266.     //ListNode* pReversedHead=ReverseList(pNode1);
  267.     //ListNode* pReversedHead=ReverseList2(pNode1);
  268.     //PrintList(pReversedHead);

  269.     //合并链表
  270.     //pNode=MergeList(pNode1,pNode2);
  271.     //PrintList(pNode);
  272.     
  273.     //翻转打印链表
  274.     //RPrintList(pNode);
  275.     
  276.     //获取倒数第三个链表
  277.     //pNode=RGetKthNode(pNode2,3);
  278.     //cout<<"倒数第三个元素"<<pNode->m_nValue<<endl;
  279.     
  280.     //获取链表中间元素
  281.     //ptmepNode=GetMiddleNode(pNode);
  282.     //cout<<"中间元素为"<<ptmepNode->m_nValue<<endl;

  283. //判断链表是否存在环
  1.  /* if(HasCircle(pNode))
  2.     {
  3.         cout<<"存在环"<<endl;
  4.     }
  5.     else
  6.     {
  7.         cout<<"不存在环"<<endl;
  8.     }
  9. */

  10. //判断两个链表是否相交
  11.     if(IsIntersected(pNode1,pNode2))
  12.     {
  13.         cout<<"相交"<<endl;
  14.     }
  15.     else
  16.     {
  17.         cout<<"不相交"<<endl;
  18.     }
  19.     
  20.     //获取链表相交的第一个节点
  21.     ptmepNode=GetFirstCommonNode(pNode1,pNode2);
  22.     if(ptmepNode==NULL)
  23.     {
  24.         cout<<"不相交"<<endl;
  25.     }
  26.     else
  27.     {
  28.         cout<<"相交第一个点的值"<<ptmepNode->m_nValue<<endl;
  29.     }
  30.     
  31.     return 0;
  32. }

阅读(715) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~