Skip to content

Latest commit

 

History

History
77 lines (73 loc) · 2.55 KB

File metadata and controls

77 lines (73 loc) · 2.55 KB
/*
题目:给定一个链表,判断链表中是否有环。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。
如果链表中存在环,则返回 true 。 否则,返回 false 。
进阶:你能用 O(1)(即,常量)内存解决此问题吗?
例子:
输入:head = [3,2,0,-4], pos = 1
输出:true<br>
解释:链表中有一个环,其尾部连接到第二个节点。

 */
/**
 * Definition for singly-linked list.
 */
function ListNode(val) {
  this.val = val;
  this.next = null;
}
/**
 * @param {ListNode} head
 * @return Boolean
 */
var detectCycle = function (head) {
  // 快指针和慢指针遍历链表,如果两个指针相遇则有环,如果快指针到终点则没有环
  let fast = head;
  let slow = head;
  while (fast && fast.next) {
    fast = fast.next.next;
    slow = slow.next;
    if(fast === slow) return true
  }
  return false
};

/*
环形链表II
题目:给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。
为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意,pos 仅仅是用于标识环的情况,并不会作为参数传递到函数中。
说明:不允许修改给定的链表
进阶:你能用 O(1)(即,常量)内存解决此问题吗?
例子:
输入:head = [3,2,0,-4], pos = 1<br>
输出:返回索引为 1 的链表节点
解释:链表中有一个环,其尾部连接到第二个节点。。
 */
/**
 * @param {ListNode} head
 * @return {ListNode}
 */
var detectCycle2 = function (head) {
  // 在快慢指针相遇的地方,慢指针回到表头继续遍历,快指针也一个节点一个节点遍历,
  // 他们再次相遇的点为入环节点
  let fast = head;
  let slow = head;
  while (fast && fast.next) {
    fast = fast.next.next;
    slow = slow.next;
    if(fast === slow) {
      slow = head;
      while(slow !== fast) {
        slow = slow.next;
        fast = fast.next;
      }
      return slow;
    }
  }
  return null;
};

const a0={},a1={},a2={},a3={};
a0.val=3;a0.next=a1;
a1.val=2;a1.next=a2;
a2.val=0;a2.next=a3;
a3.val=-4;a3.next=a1;

console.log(detectCycle2(a0))