这道题的做法是遍历列表,定义一个当前结点的前驱,当前结点,当碰到和该数据相同的数,就让改数据所在结点的前驱指向当前结点的下一个结点,如果不相同,前驱和当前结点继续遍历,重复此操作,还有一种特殊情况就是当要删除的结点的数据和头结点相同时要分开处理。
有三种解决办法,第一种是直接把头结点移至下一个结点,代码如下:
public Node removeElements(Node head, int val)
{
Node pre=null;
Node cur=head;
while(cur!=null)
{
if(cur.val==val)
{
if(cur==head)
{
head=cur.next;
}
pre.next=cur.next;
}else
{
pre=cur;
}
cur=cur.next;
}
return head;
}
第二种是先遍历,遍历完之后对头结点在进行判断
public Node removeElements(Node head, int val){
if(head==null)
{
return null;
}
Node pre=head;
Node cur=head.next;
while(cur!=null)
{
if(cur.val==val)
{
pre.next=cur.next;
}
else
{
pre=cur;
}
cur=cur.next;
}
if(head.val==val)
{
head=head.next;
}
return head;
}
第三种是强行给头结点找一个值不为空的前驱,然后返回这个前驱的下一个结点
public Node removeElements(Node head, int val){
Node newHead=new Node(2);//这个值可以是任意数值
newHead.next=head;
Node pre=newHead;
Node cur=head;
while(cur!=null)
{
if(cur.val==val)
{
pre.next=cur.next;
}
else
{
pre=cur;
}
cur=cur.next;
}
return newHead.next;
}