查找循环链表的交点
来源:互联网 发布:mac版本支持远程控制 编辑:程序博客网 时间:2024/05/16 10:31
Given a circular linked list, implement an algorithm which retrns node at the beginning of the loop.
原题如下:
首先先判断一下,链表有没有循环。
我们假设有两个指针,一个指针一次移动一步,另一个指针一次移动两步;如果链表有环,这两个指针必定相交。
//判断有无回环,有则返回两个指针的交点,否则返回NULLNode * hasLoop(Node *Head){Node *p1=Head;//慢指针Node *p2=Head;//快指针while(p2->next!=NULL){p2=p2->next->next;p1=p1->next;if(p1==p2)return p1;}return NULL;}
再想一下,快指针每次比慢指针多一步;在进入环的那一刻,慢指针走了k步,这时快指针已经比慢指针夺走了k步了。
假设环上有n个结点,快指针要想赶上慢指针,要再走(n-k)步。也就是说它们的相遇点离环的起始点有k步。
这时再把慢指针放到起始点,快指针每次走一步,它们再次相遇的地方就是起始点。
测试代码:
#include<iostream>using namespace std;struct Node{char data;Node *next;Node(char i):data(i),next(NULL){};};//判断有无回环,有则返回两个指针的交点,否则返回NULLNode *hasLoop(Node *Head){Node *p1=Head;//慢指针Node *p2=Head;//快指针while(p2->next!=NULL){p2=p2->next->next;p1=p1->next;if(p1==p2)return p1;}return NULL;}//有环则返回起始点,否则返回NULLNode *findStart(Node *Head){Node *meet=hasLoop(Head);if(meet)while(Head!=meet){Head=Head->next;meet=meet->next;}return meet;}int main(){Node *Head;Node *Tail;Head=Tail=new Node('A');for(int i=1;i<5;i++)//A->B->C->D->E{Node *p=new Node('A'+i);Tail->next=p;Tail=p;}//E指向CTail->next=Head->next->next;Node *t=findStart(Head);cout<<t->data<<endl;//释放结点return 0;}
0 0
- 查找循环链表的交点
- 单向链表是否有交点以及查找交点
- 单向链表是否有交点以及查找交点
- 链表的交点问题
- 循环链表的建立,查找,删除
- 求两个单向链表的交点
- 求两个相交链表的交点
- 求两个单向链表的交点
- 寻找两个链表的交点
- 求两个单向链表的交点
- 两条的链表交点
- 求两个相交链表的交点
- 求相交链表的交点
- 求两个单向链表的交点
- 双向循环链表的建立、查找、添加、删除
- 关于两个链表的交点的小结
- 判断链表是否有交点若有找出交点
- 找出带环单向链表的环入口(交点)
- 调试和修改OpenStack中的Horizon部分
- GCD
- HDU2307结构体飘过
- 脚本语言与解释性语言
- Matlab学习笔记 绘图函数详解
- 查找循环链表的交点
- KMP算法
- 微信自定义菜单view类型获取openid访问网页
- Caused by: java.lang.ClassNotFoundException: org.hibernate.annotations.common.reflection.MetadataPro
- CSMA/CD协议——学习笔记
- 修改MyEclipse的Properties文件编码方式
- 从MACHINE_START开始
- Unable to find instrumentation target package的问题
- 坦克大战