携手创作,共同成长!这是我参与「掘金日新计划 · 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 <= 500 <= 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;
};