js解leetcode(60)-简单

1.移除重复节点

题目:编写代码,移除未排序链表中的重复节点。保留最开始出现的节点。

思路:用map记录出现过的节点

  if (!head) return head;
  const res = {
      [head.val]:true
  };
  let resHead = head;
  let cur = head;
  head = head.next;
  while (head) {
    const next = head.next;
    head.next = null;
    if (!res[head.val]) {
      res[head.val]=true;
      cur.next = head;
      cur=cur.next
    }
    head = next;
  }
  return resHead;

2.返回倒数第K个节点

题目:实现一种算法,找出单向链表中倒数第 k 个节点。返回该节点的值。

思路:快慢指针。两个指针一开始都指向头,一个指针先走K步,然后两个指针同时走知道快指针到节点末尾,此时慢指针指向的就是倒数第K个节点

/**
 * Definition for singly-linked list.
 * function ListNode(val) {
 *     this.val = val;
 *     this.next = null;
 * }
 */
/**
 * @param {ListNode} head
 * @param {number} k
 * @return {number}
 */
var kthToLast = function(head, k) {
  let slow = head;
  let fast = head;
  while (k--) {
    fast = fast.next;
  }
  while (fast) {
    slow = slow.next;
    fast = fast.next;
  }
  return slow.val;
};

3.删除中间节点

题目:

实现一种算法,删除单向链表中间的某个节点(即不是第一个或最后一个节点),假定你只能访问该节点。

思路:参数是要删除的节点,那怎么弄?此时我们只知道后续节点,所以直接用下一个节点的值覆盖当前节点值,然后删除下一个节点即可

/**
 * Definition for singly-linked list.
 * function ListNode(val) {
 *     this.val = val;
 *     this.next = null;
 * }
 */
/**
 * @param {ListNode} node
 * @return {void} Do not return anything, modify node in-place instead.
 */
var deleteNode = function(node) {
    node.val=node.next.val
    node.next=node.next.next
};

4.回文链表

题目:编写一个函数,检查输入的链表是否是回文的。

思路:先用快慢指针,找到中间节点,然后反转后半段节点,比较前后两段节点即可

/**
 * Definition for singly-linked list.
 * function ListNode(val) {
 *     this.val = val;
 *     this.next = null;
 * }
 */
/**
 * @param {ListNode} head
 * @return {boolean}
 */
const reverse = (node) => {
  let pre = null;
  while (node) {
    const next = node.next;
    node.next = pre;
    pre = node;
    node = next;
  }
  return pre;
};

var isPalindrome = function (head) {
  let slow = { next: head };
  let fast = { next: head };
  while (fast && fast.next) {
    slow = slow.next;
    fast = fast.next.next;
  }
  let right = reverse(slow.next);
  while (right && head) {
    if (right.val !== head.val) return false;
    right = right.next;
    head = head.next;
  }
  return true;
};

5.链表相交

题目:

给定两个(单向)链表,判定它们是否相交并返回交点。请注意相交的定义基于节点的引用,而不是基于节点的值。换句话说,如果一个链表的第k个节点与另一个链表的第j个节点是同一节点(引用完全相同),则这两个链表相交。

思路:假定链表1 = b+c,链表 2 = d+c,c就是它们相交的节点。所以b+c+d=d+c+b,两个指针先遍历一个链表,然后遍历另一个链表。如果有相交节点,那么两个指针相等的时候就是相交的节点。如果不相交,那么到最后都是null

/**
 * Definition for singly-linked list.
 * function ListNode(val) {
 *     this.val = val;
 *     this.next = null;
 * }
 */

/**
 * @param {ListNode} headA
 * @param {ListNode} headB
 * @return {ListNode}
 */
var getIntersectionNode = function(headA, headB) {
  let prea = headA;
  let preb = headB;
  while (prea !== preb) {
    prea = prea ? prea.next : headB;
    preb = preb ? preb.next : headA;
  }
  return prea;
};

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值