程序员面试金典--题目解析-2.6 给定一个有环链表,实现一个算法返回环路的开头节点

2.6 题目:

给定一个有环链表,实现一个算法返回环路的开头节点

比如 A--B--C--D--E--C

返回C


解法:

遍历链表,把每个节点的hashcode值(地址值)作为key存入hashMap中,若后续判断存在该key,则证明存在环路,返回该结点

  1. public static <E> Node<E> isCircle(Node<E> head){  
  2.         if(head == null || head.next == null)  
  3.             return null;  
  4.           
  5.         HashMap map = new HashMap<>();  
  6.         Node<E> p = head;  
  7.         map.put(p.hashCode(), null);  
  8.           
  9.         while(p.next != null){  
  10.             if(map.containsKey(p.next.hashCode())){  
  11.                 return p.next;  
  12.             }  
  13.             else{  
  14.                 map.put(p.next.hashCode(), null);  
  15.             }  
  16.             p = p.next;  
  17.         }  
  18.         return null;  
  19.     } 


测试用例:

  1. @Test  
  2.     public void test_2_6(){  
  3.         Node<Integer> head = new Node<>(0);  
  4.         createIntegerNode(head, 20);  
  5.         printNodeList(head);  
  6.           
  7.         Node<Integer> p = head;  
  8.         while(p.getNext()!=null){  
  9.             p = p.getNext();  
  10.         }  
  11.         p.setNext(head);  
  12.           
  13.         System.out.println(LinkedListUtil.isCircle(head));  
  14.       
  15.     }  


测试结果:

0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 

Node [item=0]


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值