题目
给一个链表的头节点 head 和一个整数 val ,请删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。
输入: head = [1,2,6,3,4,5,6], val = 6 输出: [1,2,3,4,5]
题解
第一种
首先我们在函数中先判断head是否为空,如果为空那么我们直接返回head,然后我们判断头节点的下一个节点是否为空,如果是那么我们判断该节点的值是否等于val,如果相等则说明需要移除该节点,我们将head指向head.next,我们返回更新后的head即可,如果链表中有多个节点,那么我们先声明一个point的变量,将其指向head节点,point变量将被用于遍历链表,然后我们使用while循环,循环条件为point.next是否存在,在循环中,我们先判断point.next节点的值是否等于val,如果相等则说明找到了要移除的节点,我们直接将point.next节点的下一个节点赋值给point.next,继续遍历链表,当循环结束后,我们判断当前head不为空且head的值等于val,如果是我们则将head指向head.next,最后我们将head返回出去即可
var removeElements = function (head, val) { if (!head) return head; if (head.next === null) { if (head.val === val) { head = head.next; } return head; } let point = head; while (point.next) { if (point.next.val === val) { point.next = point.next.next; } else { point = point.next; } } if(head && head.val === val){ head = head.next; } return head; };
第二种
我们在函数中声明了一个ret的新节点,它的值为0,并将head节点作为其下一个节点,然后我们声明了一个名为cur的变量,默认指向ret节点,cur变量用于遍历链表,然后我们使用while循环,循环条件为cur.next,只要cur节点的下一个节点存在,循环将遍历整个链表,在循环中,我们先判断cur.next节点的值是否等于val,如果相等则说明找到了要移除的节点,然后我们将cur.next节点的下一个节点赋值给cur.next,然后我们使用continue关键字直接进入下一次循环,如果cur.next节点的值不等于val则说明当前节点不需要移除,我们将cur指向下一个节点,继续遍历链表,当循环结束后,我们返回ret.next节点即可
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 };