题目如下:
Remove all elements from a linked list of integers that have value val.
Example
Given: 1 --> 2 --> 6 --> 3 --> 4 --> 5 --> 6, val = 6
Return: 1 --> 2 --> 3 --> 4 --> 5
public ListNode removeElements(ListNode head, int val) {
ListNode node1 = head;
ListNode pre = null;
while(node1!=null){
if(node1.val!=val){
pre = node1;
}else{
if(pre==null){
head = node1.next;
}else{
pre.next = node1.next;
}
}
node1 = node1.next;
}
return head;
}
这里需要特别注意的就是第一个节点就是需要删除的节点这种情况,这时候要将node1即第一个节点的值赋值给head,那结束后返回的head就应该从此处开始(假如后面紧跟着的节点值不是val的话,如果紧跟着的节点的值是val,那就需要重复上述步骤直到第一个非val节点出现为止)。另外一点就是,假如在一次循环中删除了一个节点,那pre的位置是不需要变化的,因为pre的next已经变成了另一个新节点,这个新节点就是下次需要进行判断的,所以没必要将pre进行移动。
然后是评论区的大神代码,其中有一个是使用大家喜闻乐见的递归形式的,代码如下:
public ListNode removeElements(ListNode head, int val) {
if (head == null) return null;
head.next = removeElements(head.next, val);
return head.val == val ? head.next : head;
}
递归的思想就是逐步解决子问题,这个和之前有一道题的递归解法十分类似,右面的是之前一篇博客的链接,讲的也是和链表递归操作相关的一些问题:http://blog.csdn.net/zsy112371/article/details/52415591。
评论区的另一种方法,和我使用的方法思想类似,但是可能更简练一些,代码如下:
public ListNode removeElements(ListNode head, int val) {
ListNode top=new ListNode(0);
top.next=head;
ListNode node=top;
while(node.next!=null) {
if(node.next.val==val) {
node.next=node.next.next;
}else{
node=node.next;
}
}
return top.next;
}
还有下面这种思想都是一样的。
public ListNode removeElements(ListNode head, int val) {
ListNode fakeHead = new ListNode(-1);
fakeHead.next = head;
ListNode curr = head, prev = fakeHead;
while (curr != null) {
if (curr.val == val) {
prev.next = curr.next;
} else {
prev = prev.next;
}
curr = curr.next;
}
return fakeHead.next;
}
今天有些不开心,sad。