链表中的带环相交问题
2016-09-19 23:18
316 查看
与之相关的其他函数:
http://blog.csdn.net/snow_5288/article/details/52564615
http://blog.csdn.net/snow_5288/article/details/52550765
http://blog.csdn.net/snow_5288/article/details/52524830
函数实现:
http://blog.csdn.net/snow_5288/article/details/52564615
http://blog.csdn.net/snow_5288/article/details/52550765
http://blog.csdn.net/snow_5288/article/details/52524830
函数实现:
PNode CheckCircle(PNode pHead)//判断链表是否带环 { PNode pFast = NULL; PNode pSlow = NULL; if (NULL == pHead) { return NULL; } pFast = pHead; pSlow = pHead; while(pFast && pFast->next) { pFast = pFast->next->next; pSlow = pSlow->next; if(pFast == pSlow) break; } if(pFast == pSlow && pFast != pHead) return pFast; else return NULL; } int GetCircleLength(PNode pMeetNode)//如果带环,求环的长度 { int len = 1; PNode CurNode = pMeetNode; if(NULL == pMeetNode) return 0; while(CurNode->next != pMeetNode) { CurNode = CurNode->next; len++; } return len; } PNode GetInterNode(PNode pHead,PNode pMeetNode)//获取环的入口点 { PNode pH = pHead; PNode pM = pMeetNode; if(NULL == pHead || NULL == pMeetNode) return NULL; while(pH != pM) { pH = pH->next; pM = pM->next; } return pM; } int CheckCrossWithCircle(PNode pHead1,PNode pHead2)//判断链表是否相交(有可能带环) { PNode pMeetNode1 = NULL; PNode pMeetNode2 = NULL; if(NULL == pHead1 || NULL == pHead2) return 0; pMeetNode1 = CheckCircle(pHead1); pMeetNode2 = CheckCircle(pHead2); if(NULL == pMeetNode1 && NULL == pMeetNode2)//两个链表都不带环 { PNode p1 = pHead1; PNode p2 = pHead2; while(p1->next) { p1 = p1->next; } while(p2->next) { p2 = p2->next; } if(p1 == p2) return 1; else return 0; } else if((NULL == pMeetNode1 && pMeetNode2) || (NULL == pMeetNode2 && pMeetNode1))//一个带环一个不带环 return 0; else//两个都带环 { PNode pM1 = pMeetNode1; PNode pM2 = pMeetNode2; while(pM1 != pM1->next) { pM1 = pM1->next; if(pM1 == pM2) break; } if (pM1 == pM2) return 2; else return 0; } } PNode UnionSet(Node *list1,Node *list2)//求两个已排序单链表中相同的数据----打印出来 { PNode p1 = list1; PNode p2 = list2; PNode p3 = NULL; PNode newHead = p3; if(NULL == list1 || NULL == list2) return NULL; while(!p3) { if(p1->data == p2->data) { p3 = p1; newHead = p3; while(p1->data == p1->next->data) { p1 = p1->next; } p1 = p1->next; while(p2->data == p2->next->data) { p2 = p2->next; } p2 = p2->next; } else if(p1->data < p2->data) p1 = p1->next; else p2 = p2->next; } while(p1 && p2)//假设均是升序 { if(p1->data == p2->data) { p3->next = p1; p3 = p3->next; if(!p1->next || !p2->next) break; while(p1->data == p1->next->data) { p1 = p1->next; } p1 = p1->next; while(p2->data == p2->next->data) { p2 = p2->next; } p2 = p2->next; } else if(p1->data < p2->data) p1 = p1->next; else p2 = p2->next; } p3->next = NULL; return newHead; }测试代码:
//void test6() //{ // PNode pNode1 = NULL; // PNode pNode2 = NULL; // PNode pRet = NULL; // PNode tmp1 = NULL; // PNode tmp2 = NULL; // int ret = 0; // Init_LinkList(&pNode1); // Init_LinkList(&pNode2); // PushBack(&pNode1,1); // PushBack(&pNode1,2); // PushBack(&pNode1,3); // PushBack(&pNode1,4); // PushBack(&pNode2,5); // tmp1 = Find(pNode1,3); // tmp2 = EndNode(&pNode2); // tmp2->next = tmp1; // ret = CheckCross(pNode1,pNode2); // if(ret == 1) // printf("两个链表有交点\n"); // else // printf("两个链表无交点\n"); // pRet = Cross(pNode1,pNode2); // Print_LinkList(pRet); // Destroy(&pRet); //} //void test7() //{ // PNode pNode = NULL; // PNode pMeetNode = NULL; // PNode tmp1 = NULL; // PNode tmp2 = NULL; // PNode pInterNode = NULL; // int length = 0; // Init_LinkList(&pNode); // PushBack(&pNode,1); // PushBack(&pNode,2); // PushBack(&pNode,3); // PushBack(&pNode,4); // PushBack(&pNode,5); // tmp1 = Find(pNode,3); // tmp2 = EndNode(&pNode); // tmp2->next = tmp1; // pMeetNode = CheckCircle(pNode); // if(pMeetNode == NULL) // printf("链表不带环\n"); // else // printf("链表带环,且相遇节点为%d\n",pMeetNode->data); // length = GetCircleLength(pMeetNode); // printf("环的长度为%d\n",length); // pInterNode = GetInterNode(pNode,pMeetNode); // if(pInterNode == NULL) // printf("链表不带环\n"); // else // printf("链表带环,且相遇节点为%d\n",pInterNode->data); // free(pNode);//注意带环的链表不能再用自拟的Destroy函数销毁 //} //void test8() //{ // PNode pNode1 = NULL; // PNode pNode2 = NULL; // PNode pRet = NULL; // PNode tmp1 = NULL; // PNode tmp2 = NULL; // int ret = 0; // Init_LinkList(&pNode1); // Init_LinkList(&pNode2); // // ////两个链表都没环 // //PushBack(&pNode1,1); // //PushBack(&pNode1,2); // //PushBack(&pNode1,3); // //PushBack(&pNode1,4); // //PushBack(&pNode2,5); // //tmp1 = Find(pNode1,3); // //tmp2 = EndNode(&pNode2); // //tmp2->next = tmp1; // // ////一个有环一个没环 // //PushBack(&pNode1,1); // //PushBack(&pNode1,2); // //PushBack(&pNode1,3); // //PushBack(&pNode1,4); // //PushBack(&pNode2,3); // //tmp1 = Find(pNode1,3); // //tmp2 = EndNode(&pNode1); // //tmp2->next = tmp1; // //ret = CheckCrossWithCircle(pNode1,pNode2); // //if(ret == 1) // // printf("两个链表有交点\n"); // //else // // printf("两个链表无交点\n"); // // //两个都有环 // PushBack(&pNode1,1); // PushBack(&pNode1,2); // PushBack(&pNode1,3); // PushBack(&pNode1,4); // PushBack(&pNode2,5); // PushBack(&pNode2,3); // PushBack(&pNode2,4); // //给pNode1构造环 // tmp1 = Find(pNode1,3); // tmp2 = EndNode(&pNode1); // tmp2->next = tmp1; // //给pNode2构造环 // tmp1 = Find(pNode2,3); // tmp2 = EndNode(&pNode2); // tmp2->next = tmp1; // //使其相交 // tmp1 = Find(pNode1,2); // tmp2 = Find(pNode2,3); // tmp1->next = tmp2; // ret = CheckCrossWithCircle(pNode1,pNode2); // if(ret == 1) // printf("两个链表都不带环且有交点\n"); // else if(ret == 2) // printf("两个链表都带环且有交点\n"); // else // printf("两个链表无交点\n"); // free(pNode2); // free(pNode1); //} void test9() { PNode pNode1 = NULL; PNode pNode2 = NULL; PNode pRet = NULL; Init_LinkList(&pNode1); Init_LinkList(&pNode2); PushBack(&pNode1,1); PushBack(&pNode1,2); PushBack(&pNode1,2); PushBack(&pNode1,4); PushBack(&pNode1,4); PushBack(&pNode1,5); PushBack(&pNode2,2); PushBack(&pNode2,4); PushBack(&pNode2,5); PushBack(&pNode2,6); pRet = UnionSet(pNode1,pNode2); Print_LinkList(pRet); Destroy(&pNode1); Destroy(&pNode2); } int main() { //test1(); //test2(); //test3(); //test4(); //test5(); //test6(); //test7(); //test8(); test9(); system("pause"); return 0; }
相关文章推荐
- C语言强化(七)链表相交问题_3 判断链表是否带环
- 判断两个链表是否相交,若相交,求交点,若带环呢/fork继承问题
- 带环单链表及链表相交问题的分析及代码实现
- 7.微软亚院之编程判断俩个链表是否相交(为了简化问题,我们假设俩个链表均不带环)
- 每日一刷——1.判断两个链表是否相交,若相交求交点(链表不带环&带环)2.fork()问题
- 链表带环和相交的问题
- 65. 链表是否带环、环入口、环长度、链表相交问题分析与总结
- 链表面试题总结----(可能带环相交问题+复杂链表的复制)
- 数据结构_链表问题(倒序打印、相交、带环)
- day04之链表不带环相交+带环相交问题+fork函数输出几个短线
- 《C语言实现链表相交、带环问题》
- C语言强化(七)链表相交问题_3 判断链表是否带环
- 链表相交带环问题+复杂链表的复制
- 判断单链表是否存在环,判断两个链表是否相交问题详解
- 判断单链表是否存在环,和两条链表相交问题
- 程序员面试题精选(33):两单向链表相交问题
- 判断单链表是否存在环,判断两个链表是否相交问题详解
- 两单向链表相交问题
- 判断单链表是否存在环,判断两个链表是否相交问题详解
- 判断单链表是否存在环,判断两个链表是否相交问题详解(zz)