目录
一、题目描述

二、整体思路
首先分成两种情况。第一种情况要先判断头元素是否要删除。第二种要在第一种基础上进行(删除到头元素不是要删除的元素),然后遍历链表,遍历到不是要删除的元素再链接。
最开始的想法:遍历链表的时候不能直接用head,否则会改变head,要新设一个ListNode prev=head。用prev去链接不符合删除元素的结点。同时新设ListNode temp=head.next用于遍历。
关于链表,要想清楚的地方是:prev指向的ListNode类,改变其next属性。和head通过迭代访问next属性所访问到的类的next属性也会一起改变,因为两者访问到的是同一个类。
改进后的思路:不另外设置temp结点。只利用prev结点就足够了。当prev的下一个结点不是要被删除的结点时才更新prev,否则删除prev的下一个结点。
三、代码
java
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode removeElements(ListNode head, int val) {
while(head!=null && head.val==val){//首元素是要被删除的情况
head=head.next;
}
if(head==null) return head;//链表为空与所有元素都为要被删除的元素的情况
ListNode temp=head.next;
ListNode prev=head;
while(true){
if(temp!=null && temp.val!=val){//不是被删除的元素,要保留
prev.next=temp;
prev=prev.next;
}else if(temp==null){
prev.next=null;
break;
}
temp=temp.next;//temp是遍历的
}
return head;
}
}
java
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode removeElements(ListNode head, int val) {
while(head!=null && head.val==val){
head=head.next;
}
if(head==null) return head;
ListNode prev=head;//优化,不另外设置temp的做法
while(prev.next!=null){
if(prev.next!=null && prev.next.val==val){//prev结点下一个结点是要删除的节点
ListNode delnode=prev.next;
prev.next=delnode.next;
delnode.next=null;
}else{
prev=prev.next;//prev结点下一个结点不是要删除的节点是,把prev更新该结点
}
}
return head;
}
}