算法训练(四)含环链表的系列操作

题目一:若有一个链表,如何判断链表是否存在环?

思路:如何判断有环,这里思考之后发现,判断是否有环可以参考两个人走路,一前一后,一快一慢。如果有环,两人必定相遇。因此这次也采用这种思路

首先写一个链表类

private class Node {
    private int data;
    private Node next;
    public Node(int data) {
        this.data = data;
    }
}

然后写判断是否有环

这里首先声明两个同时指向头节点的节点,一个一次走两步,一个一次走一步,如果最终两个节点相遇,那么存在环,否则不存在。

 
private Node head;
public LinkedList() {
    head = new Node(0);
}
public boolean isCircle(LinkedList linkedList) {    //判断是否含有环
    Node a = linkedList.head;   //a指针走得快,每次2步
    Node b = linkedList.head;   //b指针走得慢,每次1步
    if (head == null) {
        return false;
    }
    while(a.next != null && a.next.next!=null) {
        a = a.next.next;
        b = b.next;
        if (a==b) {
            return true;
        }
    }
    return false;
}
 

题目二:如何计算该环的大小(长度)

思路:如果直接用a走的减去b走的,那么可能存在有时候a已经在环内转了好几圈然而b还没有到的情况。所以可以让ab从相遇的地方再走一圈。这一圈就是环的长度。

public int circleSize(LinkedList linkedList) {  //判断环有多大
    int size = 0;
    Node a = linkedList.head;
    Node b = linkedList.head;
    if (isCircle(linkedList)) { //如果存在环
        while(a.next!=b.next.next) {   //第一圈
            a = a.next.next;
            b = b.next;
            if (a==b) { //第一次相遇
                a = a.next.next;
                b = b.next;
                size++;
                while (a!=b) {  //再走一圈
                    a = a.next.next;
                    b = b.next;
                    size++;
            }
            return size;
            }
        }
    }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值