题目描述:
思路:
这是一个单向无头不循环的链表,当我们想删除链表中某一结点时,需要知道前驱节点和后继节点。
对于要删除的cur节点来说,后继节点就是cur.next。所以我们只需要声明一个Node变量来记录要删除的节点的前驱节点即可。我们用pre来标记前驱节点,cur来标记需要被删除的节点,pre初始为head,cur初始为head.next。当cur.next != null时代表链表未遍历完,当cur为null时表示链表遍历结束。遍历过程中,我们只需要关注cur节点的val属性即可。当cur.val=给定val时,表示需要删除当前cur节点,所以cur=cur.next,pre.next=cur。当不等于时需要将pre和cur节点都向后移动,即pre=cur,cur=cur.next。
这样遍历后,我们除了head节点没有判断外,其余节点已经判断。最后判断hand.val是否等于给定的val,等于则head=head.next。
代码:
/**
* 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) {
if(head==null){
return null;
}
ListNode pre=head;
ListNode cur=head.next;
while(cur!=null){
if(cur.val==val){
cur=cur.next;
pre.next=cur;
}else{
pre=cur;
cur=cur.next;
}
}
if(head.val==val){
head=head.next;
}
return head;
}
}