每日一题(11) - 统计有环单链表的环中结点个数
2013-06-22 15:51
267 查看
题目来自编程之美
题目:统计有环单链表的环中结点个数
思路:参考单链表面试题
代码
题目:统计有环单链表的环中结点个数
思路:参考单链表面试题
代码
/*思路:在快慢指针相遇位置肯定是在环中,此时一个指针不动,让另一个指针转圈,再次相遇时经过的结点个数就是环中结点个数*/ int GetCountOfCycle(ListNode* pHead) { assert(pHead != NULL); ListNode* pFast = pHead; ListNode* pSlow = pHead; int nCount = 1;//第一个结点是相遇点 while (pFast->m_pNext && pFast->m_pNext->m_pNext) { pFast = pFast->m_pNext->m_pNext; pSlow = pSlow->m_pNext; if (pFast == pSlow)//碰撞点 { //计算环中结点个数 pFast = pFast->m_pNext; while (pFast != pSlow) { nCount++; pFast = pFast->m_pNext; } return nCount; } } return 0; }测试代码
#include <iostream>
#include <assert.h>
using namespace std;
struct ListNode
{
int m_Data;
ListNode* m_pNext;
};
bool IsCycle(ListNode* pHead)
{
assert(pHead != NULL);
ListNode* pFast = pHead;
ListNode* pSlow = pHead;
while (pFast->m_pNext && pFast->m_pNext->m_pNext)
{
pFast = pFast->m_pNext->m_pNext;
pSlow = pSlow->m_pNext;
if (pFast == pSlow)
{
return true;
}
}
return false;
}
/*思路:在快慢指针相遇位置肯定是在环中,此时一个指针不动,让另一个指针转圈,再次相遇时经过的结点个数就是环中结点个数*/ int GetCountOfCycle(ListNode* pHead) { assert(pHead != NULL); ListNode* pFast = pHead; ListNode* pSlow = pHead; int nCount = 1;//第一个结点是相遇点 while (pFast->m_pNext && pFast->m_pNext->m_pNext) { pFast = pFast->m_pNext->m_pNext; pSlow = pSlow->m_pNext; if (pFast == pSlow)//碰撞点 { //计算环中结点个数 pFast = pFast->m_pNext; while (pFast != pSlow) { nCount++; pFast = pFast->m_pNext; } return nCount; } } return 0; }
void CreateList(ListNode** pHead,int nLen)//头指针使用指针的指针
{
assert(*pHead == NULL && nLen > 0);
ListNode* pCur = NULL;
ListNode* pNewNode = NULL;
for (int i = 0;i < nLen;i++)
{
pNewNode = new ListNode;
cin>>pNewNode->m_Data;
pNewNode->m_pNext = NULL;
if (*pHead == NULL)
{
*pHead = pNewNode;
pCur = *pHead;
}
else
{
pCur->m_pNext = pNewNode;
pCur = pNewNode;
}
}
}
/*把链表最后一个结点指向第三个结点*/
void CreateCycle(ListNode* pHead)
{
assert(pHead);
ListNode* pLastNode = pHead;
while (pLastNode->m_pNext)
{
pLastNode = pLastNode->m_pNext;
}
if (pHead->m_pNext && pHead->m_pNext->m_pNext)
{
pLastNode->m_pNext = pHead->m_pNext->m_pNext;
}
}
int main()
{
int nLen = 0;
bool bIsCircle = false;
ListNode* pHead = NULL;
ListNode* pHeadSec = NULL;
ListNode* pEntry = NULL;
cout<<"please input node num: ";
cin >> nLen;
CreateList(&pHead,nLen);//注意传参使用引用
CreateCycle(pHead);
bIsCircle = IsCycle(pHead);
if (bIsCircle)
{
cout<<"有环!"<<endl;
cout<<"环中结点个数: "<<GetCountOfCycle(pHead)<<endl;
}
else
{
cout<<"无环"<<endl;
}
cout<<"please input node num: ";
cin >> nLen;
CreateList(&pHeadSec,nLen);//注意传参使用引用
CreateCycle(pHeadSec);
bIsCircle = IsCycle(pHeadSec);
if (bIsCircle)
{
cout<<"有环!"<<endl;
cout<<"环中结点个数: "<<GetCountOfCycle(pHeadSec)<<endl;
}
else
{
cout<<"无环"<<endl;
}
system("pause");
return 1;
}
相关文章推荐
- 有环单链表的结点个数的统计方法
- 在O(1)时间内删除单链表结点
- 网站每日PV/IP统计/总带宽/URL统计脚本分享(依据网站访问日志)
- Oracle性能分析11:系统统计信息
- 设单链表以非递减有序排列,设计算法实现在单链表中删去值相同的多余结点。
- 每日学习心得:SQL查询表的行列转换/小计/统计(with rollup,with cube,pivot解析)
- 删除单链表的倒数第k个结点
- 判断单链表是否有环及确定环的入口结点问题
- 数据结构 - 如何判断两个无环单链表是否相交;如果相交,给出相交的第一个结点
- [python每日一练]--0004:统计文档内的单词个数
- 打印单链表的倒数第k个结点
- (2)单链表的操作 ① 输入一组整型元素序列,使用尾插法建立一个带有头结点的单链表。 ② 实现该线性表的遍历。 ③ 在该单链表的第i个元素前插入一个整数。 ④ 删除该单链表中的第i个元素,其值通过参数
- 删除单链表中指针q指向的结点
- 链表之无头指针删除单链表指定结点
- 单链表查找倒数第i个结点,linux纯C实现
- 删除一个无头单链表的非尾节点【每日一题】
- 带头结点的单链表的插入,删除,转置,清空,判断空,统计节点数目
- 单链表输出倒数第k个结点值(栈实现)
- 归并两个带头结点的递增单链表 结果为递减链表
- 单链表的排序(快排和冒泡实现)以及查找中间结点