算法6.环形链表
这个题曾经被问到过,当我准备进行逻辑推理的时候,直接被打断了,其实算法题真的背过就好了,或者把第一印象记住,之后一旦被问到,稍微摸一下脑瓜子,然后把自己背过的东西假装很顺利地推导出来,这其实才是面试官想要的东西。
给定一个链表,判断链表中是否有环。
快慢指针解法:一般提到这个链表的算法题,快慢指针这个概念我们一定要时刻牢记,不只是在这个地方有用,曾经还有一道面试题也用过这个概念,不过我现在一时半会记不起来了。显而易见,在一个环里面,跑的快的迟早能够再遇上跑得慢的。
代码如下:
/**
* @author Ted
* @version 1.0
* @date 2021/10/16 17:54
*/
public class CircleListNode {
public static void main(String[] args) {
CircleListNode circleListNode = new CircleListNode();
ListNode head = new ListNode(8);
ListNode node2 = new ListNode(3);
head.next = node2;
ListNode node3 = new ListNode(3);
node2.next = node3;
ListNode node4 = new ListNode(3);
node3.next = node4;
ListNode node5 = new ListNode(3);
node4.next = node5;
ListNode node6 = new ListNode(3);
node5.next = node6;
//尾指针指向node3 产生环
node6.next = node3;
boolean b = circleListNode.hasCycle(head);
System.out.println(b);
}
public boolean hasCycle(ListNode head) {
if (head == null || head.next == null) {
return false;
}
ListNode slow = head;
ListNode fast = head.next;
while (slow != fast) {
if (fast == null || fast.next == null) {
return false;
}
slow = slow.next;
fast = fast.next.next;
}
return true;
}
}
class ListNode{
public int val;
public ListNode next;
public ListNode(int val){
this.val = val;
}
}
评论