给定一个循环链表,实现一个算法返回这个环的开始结点
2013-08-23 19:48
288 查看
给定一个循环链表,实现一个算法返回这个环的开始结点。
定义:循环链表:链表中一个结点的指针指向先前已经出现的结点,导致链表中出现环。
输入:A –> B –> C –> D –> E –> C [结点C在之前已经出现过]
输出:结点C
![](http://img.blog.csdn.net/20130822225230656?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamlyb25nemlfY3MyMDEx/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
更直观更简单的方法。 p一个无环的链表,它每个结点的地址都是不一样的。 但如果有环,指针沿着链表移动,那这个指针最终会指向一个已经出现过的地址。 答案是不是已经呼之欲出了。嗯,没错,哈希表!
以地址为哈希表的键值,每出现一个地址,就将该键值对应的实值置为true。 那么当某个键值对应的实值已经为true时,说明这个地址之前已经出现过了, 直接返回它就OK了。
由于C++标准中没有哈希表的操作,我用map进行模拟。不过哈希表的插入和取值操作是O(1) 的时间。而map是由一个RB tree组织,为了维护这个RB tree,插入和取值都会花更多的时 间。
定义:循环链表:链表中一个结点的指针指向先前已经出现的结点,导致链表中出现环。
输入:A –> B –> C –> D –> E –> C [结点C在之前已经出现过]
输出:结点C
node* loopstart(node *head){ if(head==NULL) return NULL; node *fast = head, *slow = head; while(fast->next!=NULL){ fast = fast->next->next; slow = slow->next; if(fast==slow) break; } if(fast->next==NULL) return NULL; slow = head; while(fast!=slow){ fast = fast->next; slow = slow->next; } return fast; }
更直观更简单的方法。 p一个无环的链表,它每个结点的地址都是不一样的。 但如果有环,指针沿着链表移动,那这个指针最终会指向一个已经出现过的地址。 答案是不是已经呼之欲出了。嗯,没错,哈希表!
以地址为哈希表的键值,每出现一个地址,就将该键值对应的实值置为true。 那么当某个键值对应的实值已经为true时,说明这个地址之前已经出现过了, 直接返回它就OK了。
由于C++标准中没有哈希表的操作,我用map进行模拟。不过哈希表的插入和取值操作是O(1) 的时间。而map是由一个RB tree组织,为了维护这个RB tree,插入和取值都会花更多的时 间。
map<node*, bool> hash; node* loopstart1(node *head){ while(head){ if(hash[head]) return head; else{ hash[head] = true; head = head->next; } } return head; }
相关文章推荐
- 010给定一个循环链表,实现一个算法返回这个环的开始结点 (keep it up)
- 【Java】给定一个有环链表,实现算法返回环路的开头结点
- 给定一个有环链表,实现一个算法返回环路的开头结点
- 9.2链表(六)——给定一个有环链表,实现一个算法返回环路的开头结点
- 给定一个有环链表,实现一个算法返回环路的开头结点
- 给定一个单向链表(长度未知),请设计一个既节省时间又节省空间的算法来找出该链表中的倒数第m个元素。实现这个算法,并为可能出现的特例情况安排好处理措施。“倒数第m个元素”是这样规定的:当m=0时,链表的
- 编写算法实现建立一个带头结点的含n个元素的双向循环链表H,并在链表H中的第i个位置插入一个元素e
- 给定一个单链表,从链表返回一个随机节点的值。 每个节点必须具有相同的选择概率。 跟进: 如果这个链表非常大,而且它的长度不为人知呢? 你能解决这个问题,而不使用额外的空间?
- 请实现一个算法,确定一个字符串的所有字符是否全都不同。这里我们要求不允许使用额外的存储结构。 给定一个string iniString,请返回一个bool值,True代表所有字符全都不同,False代
- 给定一个接口返回这个接口所有实现类
- 一个链表的每个节点,有一个指向next指针指向下一个节点,还有一个rand指针指向这个链表中的一个随机节点或NULL,现在要求复制一个单链表来实现这个链表,返回复制后的新链表。
- 判断一个链表是否有环,如果有环返回环开始的结点指针
- 给定一个固定长度的数组,将递增整数序列写入这个数组。当写到数组尾部时,返回数组开始重新写,并覆盖先前写过的数,请在这个特殊数组中找出给定的整数
- 给定一棵二叉树,设计一个算法,创建含有某一深度上所有结点的链表(比如:若一棵树的深度为D,则会创建出D个链表)
- 程序员面试金典: 9.2链表 2.6给定有环链表,实现算法返回环路的开头节点
- 链式A+B有两个用链表表示的整数,每个结点包含一个数位。这些数位是反向存放的,也就是个位排在链表的首部。编写函数对这两个整数求和,并用链表形式返回结果。 给定两个链表ListNode* A,ListN
- 对于一个有序数组,我们通常采用二分查找的方式来定位某一元素,请编写二分查找的算法,在数组中查找指定元素。 给定一个整数数组A及它的大小n,同时给定要查找的元素val,请返回它在数组中的位置(从0开始),若不存在该元素,返回-1。若该元素出现多次,请返回第一次出现的位置。
- 输入一组整型元素序列,使用尾插法建立一个带有头结点的单链表。 ② 实现该线性表的遍历。 ③ 在该单链表的第i个元素前插入一个整数。 ④ 删除该单链表中的第i个元素,其值通过参数将其返回。 ⑤ 建立两个
- 链表分割 编写代码,以给定值x为基准将链表分割成两部分,所有小于x的结点排在大于或等于x的结点之前 给定一个链表的头指针 ListNode* pHead,请返回重新排列后的链表的头指针。注意:分割以
- 有一堆扑克牌,其中某张牌的张数超过了扑克牌总数的一半,请找到这张牌。写出算法思路、代码实现和算法的时间复杂度,要求算法尽可能高效。假设给定一个扑克牌的数组poker和它的大小n,请返回所求的扑克牌。