一、题目描述
给你一个链表的头节点 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
二、思路解析
移除链表中的值等于 val 的节点,由于头节点的值也可能等于 val,所以需要一个在头节点前的虚拟节点,即 node 初始值为虚拟节点,node.next == head,然后每次比较 node.next 是否等于 val值,如果相等则 node.next = node.next.next,即将 node.next 的节点移除,然后继续循环;如果不等则 node = node.next,继续让 node 往下走进行比较。
三、代码参考
1、Java
class Solution {
public ListNode removeElements(ListNode head, int val) {
// 用来返回的结果的节点 相当于指向虚拟节点
ListNode headNode = new ListNode(0,head);
// 用来遍历链表的节点,初始在虚拟节点上,即 node.next == head(头节点)
ListNode node = headNode;
// 循环终止条件为 node 下一个节点为空,即在链表的最后一个节点了
while(node.next != null){
// 判断下一个节点的值是否等于 val,node 初始值是虚拟节点,所以等于从头节点开始判断
if(node.next.val == val){
// 相等则移除下一个节点
node.next = node.next.next;
// 跳过本次循环,因为移除下一个节点就不需要移动 node,循环继续
continue;
}
// 如果不想等,则 node 节点向后移动
node = node.next;
}
// 返回头节点
return headNode.next;
}
}
2、Python
class Solution(object):
def removeElements(self, head, val):
# 用来返回的结果的节点 相当于指向虚拟节点
headNode = ListNode(0,head)
# 用来遍历链表的节点,初始在虚拟节点上,即 node.next == head(头节点)
node = headNode
# 循环终止条件为 node 下一个节点为空,即在链表的最后一个节点了
while node.next:
# 判断下一个节点的值是否等于 val,node 初始值是虚拟节点,所以等于从头节点开始判断
if node.next.val == val:
# 相等则移除下一个节点
node.next = node.next.next
# 跳过本次循环,因为移除下一个节点就不需要移动 node,循环继续
continue
# 如果不想等,则 node 节点向后移动
node = node.next
# 返回头节点
return headNode.next