203.移除链表元素
给你一个链表的头节点 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
输出:[]
提示:
- 列表中的节点数目在范围
[0, 104]
内 1 <= Node.val <= 50
0 <= val <= 50
正解
主要考查了链表的基本概念:什么是指针和节点
其实对于一个简单的node类:
public class ListNode {
//两个属性
int val;
ListNode next;
//三种构造方式
ListNode() {
}
ListNode(int val) {
this.val = val;
}
ListNode(int val, ListNode next) {//一个节点对象两个属性,一个是val值,另一个是指针
this.val = val;
this.next = next;
}
}
我们直观看它就是这样:
val是节点的值,next就是那个指针,用于指向下一个值(实际指向的是其内存空间)。了解了这些,针对此题,其实就是链表节点指针的移动:
class Solution {
public ListNode removeElements(ListNode head, int val) {
//创建一个虚拟头结点,避免删除头节点时导致的问题
ListNode dummyNode = new ListNode(val - 1);
dummyNode.next = head;//将虚拟头结点指针指向head
ListNode prev = dummyNode;
//确保当前结点后还有结点
while (prev.next != null) {
if (prev.next.val == val) {//若指针指向的下一个数的val为目标值,跳过该数并将指针引向它后面的数
prev.next = prev.next.next;
} else {
prev = prev.next;//否则指针指向下一个数
}
}
return dummyNode.next;
}
}
(注意:这里的虚拟头只是为了连接起整个链表,没有其他实际意义;头节点.next返回的是整个链表内容)