「前端刷题」203.移除链表元素(EASY)

95 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第2天,点击查看活动详情

题目(Remove Linked List Elements)

链接:https://leetcode-cn.com/problems/remove-linked-list-elements
解决数:2508
通过率:54%
标签:递归 链表 
相关公司:facebook amazon pure-storage 

给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。

 

示例 1:

输入: head = [1,2,6,3,4,5,6], val = 6
输出: [1,2,3,4,5]

示例 2:

输入: head = [], val = 1
输出: []

示例 3:

输入: head = [7,7,7,7], val = 7
输出: []

 

提示:

  • 列表中的节点数目在范围 [0, 104] 内
  • 1 <= Node.val <= 50
  • 0 <= val <= 50

思路

链表的基本操作:删除链表节点 1.遍历链表,遇到等于给定值的节点,那么把这个值的上一个节点连接到这个值的下一个节点上,就相当于删除该值 2.需要的指针 prev,curr

代码

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

var removeElements = function(head, val) {
  let newHead = new ListNode( null ),
      prev = newHead,
      curr = head;
  newHead.next = head;
  
  while (curr) {
    if (curr.val === val) {
      prev.next = curr.next;
      curr = prev.next;
    }
    else {
      prev = curr;
      curr = curr.next;
    }
  }
  
  return newHead.next;
};

思路2

  • 使用递归的方式,只需要考虑当前节点是否等于val值,如果当前节点等于val值,则返回当前节点的下一个节点,否则返回当前节点
  • 使用迭代的方式,如果遍历到的节点的值等于val值,则将当前节点的next指针指向当前指向的节点的下一个节点,就相当于删除节点了

迭代的方式

/**
 * @param {ListNode} head
 * @param {number} val
 * @return {ListNode}
 */
var removeElements = function (head, val) {
  let dummyNode = new ListNode(-1);
  dummyNode.next = head;
  let p = dummyNode;
  while (p.next != null) {
    if (p.next.val == val) {
      // 如果遍历到的节点的值等于val值,则将当前节点的next指针指向当前指向的节点的下一个节点
      p.next = p.next.next;
    } else {
      p = p.next;
    }
  }
  return dummyNode.next;
};

递归的方式

/**
 * @param {ListNode} head
 * @param {number} val
 * @return {ListNode}
 */
var removeElements = function (head, val) {
  if (head == null) {
    return head;
  }
  head.next = removeElements(head.next, val);
  // 只需要考虑当前节点是否等于val值,如果当前节点等于val值,则返回当前节点的下一个节点,否则返回当前节点
  return head.val == val ? head.next : head;
};