环形链表相关题目解析
来源:互联网 发布:电视盒子无法安软件 编辑:程序博客网 时间:2024/05/17 07:31
环形链表也是近年来面试笔试中常考问题,于是就在网上整理了相关的题目与解析。
1.判断一个链表是不是环形链表
思路:这里给定两个指针,fast和slow。两个指针同时从头结点开始出发,fast指针走两步,slow指针走一步;若链表有环,这两个指针肯定会在某点相遇;若链表无环,fast会直接先到达NULL。
代码:
bool Iscircle(Node *head)//判断是否有环{ Node *slow=head; Node *fast=head; if(head==NULL||head->next==NULL)return false; while(slow!=NULL&&fast!=NULL&&fast->next!=NULL) { fast=fast->next->next; slow=slow->next; if(fast==slow) return true; } return false;}
2.环形链表的起始位置
思路:按照上面的思路,假设两个指针在(图Z点)相遇,此时slow指针走过的路径是a+b,而fast指针走过的路径是a+b+c+b。由于fast的步长是slow的两倍,因此可以得到:2(a+b)=a+b+c+b,解得a=c。由上图可以看出从X点到Y点的距离与从Z点到Y点的距离相等,即让slow指针与fast指针相遇后,我们让slow指针再指向头结点(X点),此时fast指针位置不变,再让slow和fast指针同时后移,当两个指针相遇时,slow和fast指向的是恰好是环形链表的起始节点(Y点)。
代码:
Node* BeginNode(Node *head){Node *slow = head;Node *fast = head;if(head==NULL||head->next==NULL)return NULL;while(slow!=NULL&&fast!=NULL&fast->next!=NULL)//找到相遇点{slow=slow->next;fast=fast->next->next;if(slow==fast)break;}if(fast==NULL)return NULL;slow=head;//从头开始while(slow!=fast){slow=slow->next;fast=fast->next;}return fast;}
3.求解环的长度
思路:如上图所示:环的长度为b+c ,由上题可知 a=c,环的长度即为a+b,即slow指针所走过的步长。
4.判断两个链表是不是相交的
思路:若果两个链表相交,那么这两个链表的尾节点一定相同。直接判断尾节点是否相同即可。这里把这道题放在环形链表,因为环形链表可以拆成Y字的两个链表。
1 0
- 环形链表相关题目解析
- 链表相关题目
- LintCiode:链表相关题目
- 环形链表
- 判断环形链表
- 环形链表
- 环形链表
- 数据结构:环形链表
- 链表相关面试题目 反转 合并
- 链表相关题目的实现
- Apache中的环形链表
- 环形链表的创建
- Apache中的环形链表
- 环形链表的实现
- List环形双向链表
- 链表相关知识点解析
- 使用环形链表实现约瑟夫环
- 【环形链表】丢手帕问题
- 通过U盘安装Fedora21 Workstation
- iOS UICollectionView 入门 04 使用UICollectionView的准备工作
- 使用Openssl的AES加密算法
- brief note on Makefile
- 记一次谈判实践
- 环形链表相关题目解析
- Fragment生命周期
- 用CornerStone配置SVN,HTTP及svn简单使用说明
- 判断一颗二叉树是否为平衡二叉树
- clearcase 常用命令参考
- Win7下使用VS2013编写的ActvieX在XP下注册提示:LoadLibrary("XXX.dll")失败-找不到指定的程序
- CheckBoxGroup
- RSA算法原理及其Openssl库函数
- Android 从资源文件中解析Excel