在这个题上栽了好多次
第一次,想法是添加一个头节点,利用T.next.val==val来判断
class Solution {
public ListNode removeElements(ListNode head, int val) {
ListNode T = new ListNode(0);
ListNode Reserve=T;
T.next=head;
if(head==null) return head;
while(T.next!=null) {
if(T.next.val==val) {
T.next=T.next.next;
T=T.next;
}
else{
T=T.next;
}
}
return Reserve.next;
}
}
while(T.next!=null)会报空指针异常,这是因为T可能会是null
改成 while(T!=null && T.next!=null)
但是测试点为[7, 7, 7, 7], 7时会出现错误,这是因为一旦第一个7会被检测到,直接会指向第一个7后面的元素——第二个7,但第二个7并没有经过检测过程。
改成T.val !=val时,就让指针指向这个元素
class Solution {
public ListNode removeElements(ListNode head, int val) {
ListNode T = new ListNode(0);
ListNode Reserve=T;
while(head!=null) {
if(head.val!=val) {
T.next=head;
T=T.next;//最后肯定是携带尾巴的
}
head=head.next;
}
return Reserve.next;
}
}
忽视了一个问题,最后一个选中的元素可能是带尾巴的,所以在return 之前要斩掉尾巴
T.next=null;