持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第20天,点击查看活动详情
题目来源
题目介绍
给你一个链表的头节点
head和一个整数val,请你删除链表中所有满足Node.val == val的节点,并返回 新的头节点 。
输入: head = [1,2,6,3,4,5,6], val = 6
输出: [1,2,3,4,5]
题目分析
这里我们首先需要知道什么是链表,链表是一种通过指针串联在一起的线性结构,每一个节点由两部分组成,一个是数据域一个是指针域(存放指向下一个节点的指针),最后一个节点的指针域指向null(空指针的意思)。链接的入口节点称为链表的头结点也就是head
已知一个头节点head,和一个整数val,需要删除节点的val等于整数的节点,因此我们要确认就是要删除对应的节点,就是把这个节点的next往后移动一个位置,即删除了。
就是head.next=head.next.next,这样的意思就是删除了一个节点。
题目解答
/**
* Definition for singly-linked list.
* function ListNode(val, next) {
* this.val = (val===undefined ? 0 : val)
* this.next = (next===undefined ? null : next)
* }
*/
/**
* @param {ListNode} head
* @param {number} val
* @return {ListNode}
*/
var removeElements = function(head, val) {
const ret = new ListNode(0, head);
let cur = ret;
while(cur.next) {
if(cur.next.val === val) {
cur.next = cur.next.next;
continue;
}
cur = cur.next;
}
return ret.next;
};
这里我们增加了一个头节点,只要cur.next存在,那么就判断val是否相等,如果满足,那么移除这个节点,然后给头节点重新赋值,继续循环,直到不存在next,最终ret.next就是移除满足条件节点后的head头节点。
官方解答
var removeElements = function(head, val) {
if (head === null) {
return head;
}
head.next = removeElements(head.next, val);
return head.val === val ? head.next : head;
};
官方这个利用了递归来处理,很精髓啊,完美诠释了递归的用法,很值得学习,因为递归真的方便,省了好多代码,并且性能也相对前面的while循环更好。 因为我们就是要求移除满足条件的head新节点,因此当head等于null时,说明递归结束,这个head==null实际是head.next==null。 递归的终止条件是 head 为空,此时直接返回 head。当 head 不为空时,递归地进行删除操作,然后判断 head 的节点值是否等于 val 并决定是否要删除 head。
总结
链表相关题目主要就是要掌握递归用法,这是经常需要用到的。