剑指offer之面试题15-2:单链表是否有环
2016-04-23 15:35
681 查看
题目描述
判断一个单链表是否形成了环形结构。
思路:首先,有环的定义是,链表的尾节点指向了链接中间的某个节点。比如下图,如果单链表有环,则在遍历时,在通过6之后,会重新回到3,这道题和求链表的倒数第k个结点一样,采用的思想都是定义两个指针,使两指针在遍历时以某种方式错开,最后看两个指针是否相等。错开方式有两种。
![](http://www.nowamagic.net/librarys/images/201205/2012_05_10_01.png)
solution1:使用pHead、pBehind两个指针,pHead一直向前走,pBehind每次都从头开始走,对于每个结点,看pHead走的步数是否和pBehind一致。如pHead从6走到3,走了6步,而pBehind走了2步骤,步数不一致,说明有环。
代码如下:
solution2:使用pFast、pSlow两个指针,pFast每次向前走2步,pSlow每次向前走1步,若在某个时候pFast== pSlow,则存在环。
牛客网提交成功:
判断一个单链表是否形成了环形结构。
思路:首先,有环的定义是,链表的尾节点指向了链接中间的某个节点。比如下图,如果单链表有环,则在遍历时,在通过6之后,会重新回到3,这道题和求链表的倒数第k个结点一样,采用的思想都是定义两个指针,使两指针在遍历时以某种方式错开,最后看两个指针是否相等。错开方式有两种。
![](http://www.nowamagic.net/librarys/images/201205/2012_05_10_01.png)
solution1:使用pHead、pBehind两个指针,pHead一直向前走,pBehind每次都从头开始走,对于每个结点,看pHead走的步数是否和pBehind一致。如pHead从6走到3,走了6步,而pBehind走了2步骤,步数不一致,说明有环。
代码如下:
/** * Definition for singly-linked list. * class ListNode { * int val; * ListNode next; * ListNode(int x) { * val = x; * next = null; * } * } */ import java.util.*; public class Solution { /*public static class ListNode{ int val; ListNode next; ListNode(int x){ val=x; next=null; } }*/ public static boolean hasCycle(ListNode head) { if(head==null) return false; ListNode pHead=head; ListNode pBehind=null; int pos1=0; while(pHead.next!=null){ pos1++; pBehind=head; int pos2=0; while(pBehind.next!=null){ pos2++; if(pHead==pBehind){ if(pos1!=pos2){ return true; } else break; } pBehind=pBehind.next; }//end while pHead=pHead.next; }//end while return false; } /*public static void main(String[] args){ List<ListNode> list=new ArrayList<ListNode>(); list.add(new ListNode(1)); list.add(new ListNode(2)); list.add(new ListNode(3)); list.add(new ListNode(4)); list.add(new ListNode(5)); list.add(new ListNode(6)); for(int i=0;i<list.size();i++){ ListNode listNode=list.get(i); if(i+1<list.size()){ listNode.next=list.get(i+1); } //add a loop 6-->3 listNode.next=list.get(2); } if(hasCycle(list.get(0))){ System.out.println("List has loop"); } }*/ }
solution2:使用pFast、pSlow两个指针,pFast每次向前走2步,pSlow每次向前走1步,若在某个时候pFast== pSlow,则存在环。
牛客网提交成功:
public static boolean hasCycle(ListNode head) { if(head==null) return false; ListNode pFast=head;//一次走两步 ListNode pSlow=head;//一次走一步 while(pFast.next!=null&&pSlow.next!=null&&pFast.next.next!=null){ pFast=pFast.next.next; pSlow=pSlow.next; if(pFast==pSlow){ return true; } }//end while return false; }
相关文章推荐
- 码农小汪剑指Offer之42-翻转单词顺序列
- 全面解析《嵌入式程序员应该知道的16个问题》
- 盘点国内程序员不常用的热门iOS第三方库:看完,还敢自称”精通iOS开发”吗?
- 码农小汪剑指Offer之41-左旋转字符串
- 码农小汪剑指Offer之40-和为S的两个数字(有序数组) 左右夹逼
- 求职面试-HR会问你什么问题?
- 记录在项目中碰到的问题和需要总结的东西(1)
- 码农小汪剑指Offer之39-和为S的连续正数序列
- 面试题当中的算法题
- 11个提问频率最高的PHP面试题
- 微软面试小结
- 8年女程序员带一个项目后的总结
- 面试之1604
- LeetCode(68)-Compare Version Numbers
- 十大编程算法助程序员走上大神路
- Android 面试精华题目总结
- 华为2016实习生面试感想
- 谈谈程序员的职业方向(下)
- GEEK学习笔记— —程序员面试宝典笔记(四)
- 面试心得与总结---BAT、网易、蘑菇街