题目要求:删除链表中等于给定值 val 的所有节点。
法一:无头结点
class Solution {
public ListNode removeElements(ListNode head, int val) {
while(head != null && head.val == val){ //1.考虑头节点就是待删除的节点 2.考虑头节点为null
ListNode delNode = head;
head = head.next;
delNode.next = null;
}
if(head == null) //考虑删除广域完前面的已经为空 或者一开始就为空
return null;
ListNode prev = head; //此时的head已经确定不是待删除的节点了
while(prev.next != null){
if(prev.next.val == val){
ListNode delNode = prev.next;
prev.next = delNode.next;
delNode.next = null; //注意 此时的prev.next不需要向后 已经向后了
}else{
prev = prev.next;
}
}
return head;
}
}
法二:忽略内存释放为题
class Solution {
public ListNode removeElements(ListNode head, int val) {
while(head != null && head.val == val){ //1.考虑头节点就是待删除的节点 2.考虑头节点为null
head = head.next;
}
if(head == null) //考虑删除广域完前面的已经为空 或者一开始就为空
return null;
ListNode prev = head; //此时的head已经确定不是待删除的节点了
while(prev.next != null){
if(prev.next.val == val){
prev.next = prev.next.next;
}else{
prev = prev.next;
}
}
return head;
}
}
法三 加入虚拟头节点
class Solution {
public ListNode removeElements(ListNode head, int val) {
ListNode dummyHead = new ListNode(-1);
dummyHead.next = head; //使用虚拟头节点,可以节省头节点与其他节点处理的不同操作
ListNode prev = dummyHead;
while(prev.next != null){
if(prev.next.val == val){
prev.next = prev.next.next;
}else{
prev = prev.next;
}
}
return dummyHead.next; //这里不能返回head! 画图理解
}
}
法四 递归
class Solution {
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;
}
}