方法:用一个指针的移动直接在链表上进行删除。
设置一个临时变量temp并指向头结点(注意题目的头结点指向的第一个元素)。
由于单链表结点的删除需要知道它的前一个结点,因此头指针是删除不了的。这里我们分三种情况:①链表为空 ②只有一个结点 ③有两个及其以上结点。
将第一种情况单独处理,返回头结点。其他情况用while循环来判断,当遇到某个结点的val值与题目所给val值相等,做删除操作;反之移动temp到下一个结点。
然后再判断头结点val值,与题目val值相等则移动头结点。
最后返回头结点。
下面是代码展示:
/**
* 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) {
//设置一个临时结点指向头结点
ListNode temp=head;
//链表为空,返回头结点
if(head==null)
return head;
//当指针移动到了最后一个结点,跳出循环
while(temp.next!=null)
{ //找到val值对应的结点,做删除操作
if(temp.next.val==val)
temp.next=temp.next.next;
//没找到,指针后移
else
temp=temp.next;
}
//判断头结点val与题目的val是否相等
if(head.val==val)
head=head.next;
//返回头结点
return head;
}
}
![](https://img-blog.csdnimg.cn/img_convert/6a2d0bfdead687624dee0218c567e951.png)