您的位置:首页 > 理论基础 > 数据结构算法

判断一个单链表是否有环,若有环,求进入环中的第一个节点

2017-07-19 17:23 323 查看
判断单向链表是否有环,可以采用快指针与慢指针两个指针的方式来解决。即定义一个快指针fast和一个慢指针slow,使得fast每次跳跃两个节点,slow每次跳跃一个节点。如果链表没有环的话,则slow与fast永远不会相遇(这里链表至少有两个节点);如果有环,则fast与slow将会在环中相遇。判断出链表有环以后,则需要算出进入环的第一个节点。在fast与slow第一次相遇后,设置一个节点p从链表的头部开始遍历,每次只遍历一个节点。这样,当fast与slow再次相遇时,p所处的位置便是环的首部。

1.判断一个单链表是否有环.

Public static boolean hasCycle(listNode head) {

boolean flag = false;
ListNode fast = head;
ListNode slow = head;

while(fast != null && fast.next != null) {
slow = slow.next;
fast = fast.next.next;

if(fast == slow){
flag = true;
break;
}
return flag;
}


2.判断一个单链表中是否有环,若有环,求进入环中的第一个节点.

Public ListNode getFirstNodeInCycle(ListNode head) {

if(head == null) {
return null;
} else {

ListNode fast = head;
ListNode slow = head;

while(fast != null && fast.next != null) {

slow = slow.next;
fast = fast.next.next;

if(fast == slow){

//有环,则返回环的第一个节点
slow = head;
while(slow != fast){
slow = slow.next;
fast = fast.next;
}
return slow;
}
}
return null;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐