141. Linked List Cycle 判断单链表中是否有环

141. Linked List Cycle

问题:给定单链表,判断是否存在环。
要求:不使用额外空间。

这里写图片描述

判断方法:
1、从链表头开始遍历整个链表,并且记录已经遍历过的结点地址,如果发现有正在遍历的结点是已经遍历过的,则说明是存在环的。但是这种方式就需要使用额外的空间来存放遍历过的结点地址。
2、设置两个指针,p和q,p从链表头开始,每次向前走一步,而q每次都从链表头开始,走到p会到达的结点,若p的累计步数和q每次的步数都一致,那么就不存在环,反之,则存在环。
3、设置两个指针,快指针p和慢指针q,两个指针都从链表头开始,p每次向前走两步,q每次向前走1步,若p始终在q的前面直到到达链表尾,那么就不存在环,若p和q在某一个结点相遇,那么说明存在环。

需要注意的地方:
1、对于单向链表,每个结点都只有一个直接后继结点。
2、Line 18: error: illegal character: ‘\uff1b’ 这种错误代表是使用的中文标点符号。

自己写的1:(java)
这个是根据方法2来写的代码,但是存在一个问题就是当链表很长时,越到后面,每一次循环的时间会越长,因此会导致时间复杂度很大。

/**
 * Definition for singly-linked list.
 * class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */
public class Solution {
    public boolean hasCycle(ListNode head) {
        ListNode p;
        ListNode q;
        p = head;
        q = head;
        if(head==null || head.next==null){  
                return false;  
        }  
        int pStep = 0;
        int resultTag = 0;
        System.out.println(head.next);
        while (p.next != null) {
            p = p.next;
            pStep = pStep + 1;
            int qStep = 0;
            for (qStep = 0; q.next == p.next; qStep++) {
                q = q.next;
                System.out.println(11);
            }
            if (pStep != qStep) {
                resultTag = 1;
                break;
            }
        }
        if (resultTag == 1) {
            return true;
        }
        else {
            return false;
        }
    }
}

自己写的2:(java)
这个是根据方法3来写的代码:

/**
 * Definition for singly-linked list.
 * class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */
public class Solution {
    public boolean hasCycle(ListNode head) {

        ListNode p;
        ListNode q;
        p = head;
        q = head;
        if(p==null || p.next==null || p.next.next==null){  
                return false;  
        }  
        int pStep = 0;
        int resultTag = 0;
        System.out.println(head.next);
        while (p.next != null && p.next.next != null) {
            p = p.next.next;
            q = q.next;

            if (p == q) {
                resultTag = 1;
                break;
            }
        }
        if (resultTag == 1) {
            return true;
        }
        else {
            return false;
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值