用JavaScript写 24. 两两交换链表中的节点 19.删除链表的倒数第N个节点 面试题 02.07. 链表相交 142.环形链表II | 代码随想录训练

49 阅读1分钟

24.两两交换链表中的节点

本题要点

要点看代码中的注释

代码实现

function swapPairs(head: ListNode | null): ListNode | null {
  // 定义虚拟头节点
  let dummyHead = new ListNode(0, head);
  let cur = null, temp1 = null, temp2 = null, temp3 = null;
  cur = dummyHead;
​
  while(cur.next !== null && cur.next.next !== null){
    temp1 = cur.next;
    temp2 = cur.next.next;
    temp3 = cur.next.next.next;
    
    cur.next = cur.next.next;
    temp2.next = temp1;
    temp1.next = temp3;
    // 指向下一个节点
    cur = cur.next.next;
  }
  return dummyHead.next;
};

19.删除链表的倒数第N个节点

本题要点

cur表示较慢的指针,fast表示较快的指针。

fast前移n+1位后,cur和fast一起遍历,当fast指向null时,cur指向待移除元素的前一位,执行移除操作。

代码实现

var removeNthFromEnd = function (head, n) {
  let dummyHead = new ListNode(0, head);
  let cur = dummyHead
  let fast = dummyHead
  while(n-- && fast){
    fast = fast.next;
  }
  //fast到末尾时(为null时),cur需要指向待删除元素前一位
  fast = fast.next;
  while(fast){
    fast = fast.next;
    cur = cur.next;
  }
  cur.next = cur.next.next;
  return dummyHead.next;
};

面试题 02.07. 链表相交

本题要点

将两个链表尾端平齐之后,比较节点是否一样,节点一样的时候说明链表在此节点汇合成一个。

代码实现

var getIntersectionNode = function(headA, headB) {
  let lenA = 0, lenB = 0;
  let curA = headA, curB = headB;
    //统计A B链表的长度
  while(curA){
    curA = curA.next;
    lenA++;
  }
  while(curB){
    curB = curB.next;
    lenB++;
  }
  curA = headA;
  curB = headB;
    //解构赋值
  if(lenB > lenA){
    [lenA, lenB] = [lenB, lenA];
    [curA, curB] = [curB, curA];
  }
  let gap = lenA - lenB;
  while(gap--){
    curA = curA.next;
  }
  while(curA && curB){
    if(curA === curB){
      return curA;
    }
    curA = curA.next;
    curB = curB.next;
  }
  return null;
};

142.环形链表II

本题要点

微信图片_20230206164223.jpg

代码实现

var detectCycle = function (head) {
  let fast = head, slow = head;
  while (fast && fast.next) {
    fast = fast.next.next;
    slow = slow.next;
    if (fast === slow) {
        //直接使用slow,让他们同时后移x(或者说z)步
      slow = head;
      while (fast !== slow) {
        fast = fast.next;
        slow = slow.next;
      }
      return fast;
    }
  }
  return null;
};