判断链表 有环

第一种解法,记录每一出现的元素/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * }
 */
class Solution {
public:
    bool hasCycle(ListNode *head) {

        map<ListNode *,bool>m;
        while(head){
            if(m.count(head)) return true;
            else m.insert(pair<ListNode *,bool>(head,true));
            head = head->next;
        }
        return false;
    }
};
第二种解法,把每一个出现过的元素值改成一个不可能出现的值,eg:99999
class Solution {
public:
    bool hasCycle(ListNode *head) {
        if(head == NULL) return false;
        ListNode *temp=head;
        ListNode *temp1;
        int val =temp->val;
        ListNode x(99999);
        ListNode *x_p = &x;
        while((temp->next!=x_p) && ((temp->next!=NULL)))
        {
            temp1 =  temp;
            temp =temp->next;
            temp1->next = x_p;
        }
        if(temp->next == x_p)
         return true;
        return false;
    }
时间: 2024-11-04 11:34:51

判断链表 有环的相关文章

怎么判断链表有环,怎么判断链表环的入口

来自http://blog.csdn.net/wuzhekai1985/article/details/6725263 ---------------------- 问题1,如何判断链表中是否存在环?即上图中从E到R组成的环? 设slow/fast两个指针,同时从链表起点开始,其中快指针fast每次移动长度为2,slow每次移动一个.如果无环,开始遍历之后fast不可能与slow重合,且fast或fast->next最终必然到达null; 如果有环,那么fast必然不迟于slow先到达环,且由于

判断链表中有环

1.第一种实现 bool List_is_loop(slist *head) { slist *slow=head; slist *fast=head; while(NULL!=fast && NULL!=fast->next) { slow=slow->next; fast=fast->next->next; if(slow==fast) break; } // 无环:当链表个数为基数时fast->next总是为NULL:当链表个数为偶数时fast总是为NU

【链表】怎么判断链表有环,怎么找环节点

思路(证明有环): 定义快慢指针fast和slow,fast每次前进两步,slow每次前进一步: 当fast和slow在到达链尾之前相遇的话,就证明有环(类似于在操场上跑步跑的慢的被快的套圈但总会遇到): 思路(找环结点): fast和slow相遇之后,fast不动,slow回到最初的起点,然后一步一步的等在再次相遇,这时候相遇地点就是环结点 证明如下,是个数学问题... 设一环的距离是R,k代表环数 slow走过的距离:AB+BC fast走过的距离:AB+BC+k*R 因为slow每次一步,

《编程之美》3.6判断链表是否相交之扩展:链表找环方法证明

先看看原题:<编程之美>3.6编程判断两个链表是否相交,原题假设两个链表不带环. 为了防止剧透使得没看过原题目的读者丧失思考的乐趣,我把最好的解法隐藏起来.由于这个问题本身的解答并不是本文的重点,扩展问题也采用这种形式呈现. 注:位于(*)符号之间的文字出自于:http://blog.csdn.net/v_july_v/article/details/6447013,作者v_JULY_v. 用指针p1.p2分别指向两个链表头,不断后移:最后到达各自表尾时,若p1==p2,那么两个链表必相交 用

链表(13)----判断链表是否有环,并返回环入口节点

1.链表定义 typedef struct ListElement_t_ { void *data; struct ListElement_t_ *next; } ListElement_t; typedef struct List_t_{ int size; int capacity; ListElement_t *head; ListElement_t *tail; } List_t; 2.判断链表是否有环,并返回链表入口节点 (1)方法一:根据相遇节点.头结点.入口节点之间的距离关系求解

判断链表是否有环

Given a linked list, determine if it has a cycle in it. Follow up: Can you solve it without using extra space? 关键点:1)判断链表是否有环. 2)一个小坑在判断root和root的next是否为空上. 3)可以看为追及问题.最关键的坑在判断快走(每次走2步的节点),走1步会不会已经走到头... /** * Definition for singly-linked list. * str

单链表如何判断是否存在环

给定一个单链表,只给出头指针h: 1.如何判断是否存在环? 2.如何知道环的长度? 3.如何找出环的连接点在哪里? 4.带环链表的长度是多少? 解法: 1.对于问题1,使用追赶的方法,设定两个指针slow.fast,从头指针开始,每次分别前进1步.2步.如存在环,则两者相遇:如不存在环,fast遇到NULL退出. 2.对于问题2,记录下问题1的碰撞点p,slow.fast从该点开始,再次碰撞所走过的操作数就是环的长度s. 3.问题3:有定理:碰撞点p到连接点的距离=头指针到连接点的距离,因此,分

如何判断单链表中有环及证明过程

问题: 1.如何判断单链表里面是否有环? 算法的思想是设定两个指针p, q,其中p每次向前移动一步,q每次向前移动两步.那么如果单链表存在环,则p和q相遇:否则q将首先遇到null. 这里主要理解一个问题,就是为什么当单链表存在环时,p和q一定会相遇呢? 假定单链表的长度为n,并且该单链表是环状的,那么第i次迭代时,p指向元素i mod n,q指向2i mod n.因此当i≡2i(mod n)时,p与q相遇.而i≡2i(mod n) => (2i - i) mod n = 0 => i mod

[Leetcode] Linked list cycle ii 判断链表是否有环

Given a linked list, return the node where the cycle begins. If there is no cycle, returnnull. Follow up:Can you solve it without using extra space? 题意:给定链表,若是有环,则返回环开始的节点,没有则返回NULL 思路:题目分两步走,第一.判断是否有环,第二若是有,找到环的起始点.关于第一点,可以参考之前的博客 Linked list cycle.