问题描述:
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
1) 递归
如果到了尾部返回;如果是不要删除的中间节点,它的next是它后面的list经过remove后的list;如果是需要删除的中间节点,直接返回它后面经过remove的list。
class Solution {
public ListNode removeElements(ListNode head, int val) {
if(head == null)
return null;
if(head.val != val){
head.next = removeElements(head.next, val);
return head;
}
else{
head.next = removeElements(head.next, val);
return head.next;
}
}
}
2)使用假头
给原来的list添加一个假头,这样就可以有一个prev和一个curr指针遍历链表。
public class Solution {
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;
}
}
3)老方法
basic idea is to have two pointers, one for previous node and one for current, if current node.val == val
we want to set our previous.next to current.next.
but one problem is what if the head.val == val, I used a while loop to get ride of this situation. So I can be sure that head is always a valid node.
public ListNode removeElements(ListNode head, int val)
{
while(head != null && head.val == val){
head = head.next;
}
if(head == null)
return null;
ListNode pre = head, cur = head.next;
while(cur != null){
if(cur.val == val){
pre.next = cur.next;
}else {
pre = pre.next;
}
cur = cur.next;
}
return head;
}
* 代码均来自或参考了discussion