剑指offer55:链表中环的入口节点

题目:给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。

tips:

1.关于==和equals

    1)对于==,如果作用于基本数据类型的变量,则直接比较其存储的 “值”是否相等;

    如果作用于引用类型的变量,则比较的是所指向的对象的地址

    2)对于equals方法,注意:equals方法不能作用于基本数据类型的变量

            equals方法是基类Object中的方法,因此对于所有的继承于Object的类都会有该方法

    如果没有对equals方法进行重写,则比较的是引用类型的变量所指向的对象的地址;

    诸如String、Date等类对equals方法进行了重写的话,比较的是所指向的对象的内容。

在Java中游8种基本数据类型:

  浮点型:float(4 byte), double(8 byte)

  整型:byte(1 byte), short(2 byte), int(4 byte) , long(8 byte)

  字符型: char(2 byte)

详见:https://www.cnblogs.com/dolphin0520/p/3592500.html

2. 

        ListNode node2 = new ListNode(2);
        ListNode node3 = new ListNode(3);
        ListNode node4 = new ListNode(4);
        ListNode node5 = new ListNode(5);
        ListNode node7 = new ListNode(2);

        node1.next=node2;
        node2.next=node3;
        node3.next=node4;
        node4.next=node5;
        node5.next=node7;
        System.out.println(node2.equals(node7)+"\t"+node2+"\t"+node7+"\t"+node7.next);
        node7.next=node3;
        System.out.println(node2.equals(node7)+"\t"+node2+"\t"+node7+"\t"+node7.next);
//        即使node2和node7的val相同,next指向相同,但是他们的地址不同,node7不是node2的复制/对象的引用(浅拷贝node7=node2);

 

代码:

//    hash版本,仅判断hash.containsKey(node)是否存在这个节点进行
    public static ListNode EntryNodeOfLoop1(ListNode pHead){
            ListNode node = pHead;

            HashMap<ListNode,Boolean> map = new HashMap<>();

            while(node!=null){
                if(map.containsKey(node)){
                    return node;
                }else{
                    map.put(node,true);
                    node = node.next;
                }
            }

            return null;
    }


    //    两个指针,一快一慢,若快的追上慢的,则存在换,否则null。若存在,则从相遇的节点开始(此节点在环内)计数,再次相遇为环的节点个数
    public static ListNode EntryNodeOfLoop(ListNode pHead) {
        if (pHead == null) {
            return pHead;
        }

        ListNode last = pHead;
        ListNode fast = pHead.next==null?null:pHead.next;
//        只要出现null节点,则不存在环,返回null
        while (fast != last  ) {
            if (fast.next != null&&last.next!=null) {
                fast = fast.next.next;
                last = last.next;
            }else {
                return null;
            }
        }
//        计算环的长度count,不一定需要
//        if (fast == last) {
//            int count = 0;
//            while (count==0||fast != last) {
//                if (fast.next != null) {
//                    fast = fast.next.next;
//                }
//                last = last.next;
//                ++count;
//            }
//            fast = pHead;
//            last = pHead;
//            while (count > 0) {
//                fast = fast.next;
//                --count;
//            }
//            while (fast != last) {
//                fast = fast.next;
//                last = last.next;
//            }
//            return fast;
//        }
//        慢,出不来
        fast=pHead;
        while (fast!=last){
            fast=fast.next;
            last=last.next;
        }
        return last;
    }

 

全部评论

相关推荐

来个厂收我吧:首先,市场侧求职我不是很懂。 但是,如果hr把这份简历给我,我会觉得求职人不适合做产品经理。 问题点: 1,简历的字体格式不统一,排版不尽如人意 2,重点不突出,建议参考star法则写个人经历 3,印尼官方货币名称为印度尼西亚卢比(IDR),且GMV690000印尼盾换算为305人民币,总成交额不高。 4,右上角的意向职位在发给其他公司时记得删除。 5,你所有的经历都是新媒体运营,但是你要投市场营销岗位,jd和简历不匹配,建议用AI+提示词,参照多个jd改一下经历内容。 修改建议: 1,统一字体(中文:思源黑体或微软雅黑,英文数字:time new romans),在word中通过表格进行排版(b站学) 2,校招个人经历权重:实习经历=创业经历(大创另算)>项目经历>实训经历>校园经历 3,请将项目经历时间顺序改为倒序,最新的放最上方。 4,求职方向不同,简历文字描述侧重点也需要不同。
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务