计算链表的长度长度

单链表的长度_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
评价文档:
单链表的长度
上传于||暂无简介
大小:1.01KB
登录百度文库,专享文档复制特权,财富值每天免费拿!
你可能喜欢2990人阅读
单向链表的长度定义为链表中的节点个数。如果链表中没有环则用如下算法
链表节点定义如下
struct node
返回链表的长度
链表为空 返回0
size_t listLen(node * p)
size_t num = 0;
while (p!=NULL)
num++;
由于有环的存在,因此上面的算法有可能陷入死循环。
对于链表有没有环,可设置两个指针,访问链表。一个前进的快点,一个慢点。如果有环,那么两个指针必将相遇。因此判断链表有没有环算法如下:
bool haveRing(node *p)
node * slow = // 遍历的慢 每次前进一个节点
node * fast = // 遍历的快,每次前进二个节点
if(fast != NULL)
fast = fast -& //让fast先走一步
while (fast&& fast-&next)
if (fast == slow || fast-&next == slow)
slow = slow-&
fast = fast-&next-&
return !(fast == NULL || fast-&next == NULL);
当有环的时候如何求环的入口节点呢?
设环的长度为r,链表长度为L,节点相遇时slow走了s步,fast在环中转了n圈,入口环与相遇点距离为x,起点到环入口点的距离为a。slow走一步,fast走两步。
2s=nr+ss= nr
s = a + xL = a + r & &=& & r = L - a&a+x &= nr&= (n-1)r + r&= (n-1)r + L -a&a =&(n-1)r + L -a - xa = (n-1)r + L-s
L-s为从相遇点开始到环入口的距离。公式12就是说也就是说,从相遇点开始,从链表头到环入口点等于(n-1)循环内环+相遇点到环入口点,于是我们从链表头、与相遇点分别设一个指针,每次各走一步,两个指针必定相遇,且相遇第一点为环入口点。
算法如下:
返回链表的结尾
如果没有环,则返回NULL
如果有环,则返回节点的next 为环的入口节点
node * FindListTail(node *p)
node * slow = // 遍历的慢 每次前进一个节点
node * fast = // 遍历的快,每次前进二个节点
if(fast != NULL)
fast = fast -& //让fast先走一步
while (fast&& fast-&next)
if (fast == slow || fast-&next == slow)
slow = slow-&
fast = fast-&next-&
if (fast == NULL || fast-&next == NULL)
return NULL;
//slow表示相遇节点
//if (fast-&next == slow)
// slow = fast -&
// 谢谢网友 plylw456
指出这里的问题
fast = // 现在fast每次也仅前进一步
node *tail = NULL;
while (slow != fast)
slow = slow-&
fast = fast-&
最后,求链表的长度算法如下:
size_t listLen(node * p)
node * tail = FindListTail(p);
size_t num = 0;
while (p!=tail)
num++;
if (tail != NULL)
num +=1; // 加上最后一个节点
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:197011次
积分:2415
积分:2415
排名:第9781名
原创:45篇
转载:12篇
评论:50条
(2)(2)(3)(4)(10)(3)(1)(2)(1)(2)(1)(2)(2)(3)(1)(2)(3)(1)(3)(1)(3)(1)(3)(1)单链表的基本操作_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
单链表的基本操作
上传于||文档简介
&&编​写​一​个​完​整​的​程​序​,​实​现​单​链​表​的​建​立​、​插​入​、​删​除​、​输​出​等​基​本​操​作​。​
​
​()​建​立​一​个​带​头​结​点​的​单​链​表​。​
​
​()​计​算​单​链​表​的​长​度​,​然​后​输​出​单​链​表​。​
​
​()​查​找​值​为​x​的​直​接​前​驱​结​点​q​。​
​
​()​删​除​值​为​x​的​结​点​。​
​
​()​把​单​向​链​表​中​元​素​逆​置​(​不​允​许​申​请​新​的​结​点​空​间​)
阅读已结束,如果下载本文需要使用1下载券
想免费下载本文?
下载文档到电脑,查找使用更方便
还剩6页未读,继续阅读
你可能喜欢

我要回帖

更多关于 将长度为n的单链表 的文章

 

随机推荐