一、题目:203删除链表中等于给定值 val 的所有节点。
示例:
输入: 1->2->6->3->4->5->6, val = 6
输出: 1->2->3->4->5
二、自己的答案
var removeElements = function(head, val) {
var tmp = head;
let prev =head;
while(tmp != null){
//分析头部,并删掉头部的。
if(head.val == val){
head = head.next;
tmp = head;
prev =head;
}else{
if(tmp.val == val){
//如果中间的
prev.next = tmp.next;
tmp = tmp.next;
}else{
prev =(prev == tmp)?prev:prev.next;
tmp = tmp.next;
}
}
}
return head;
};
网上其它解法:
java
class Solution {
public ListNode removeElements(ListNode head, int val) {
//删除值相同的头结点后,可能新的头结点也值相等,用循环解决
while(head!=null&&head.val==val){
head=head.next;
}
if(head==null)
return head;
ListNode prev=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) {
if(head==null)
return null;
head.next=removeElements(head.next,val);//这里容易漏掉h
if(head.val==val){
return head.next;
}else{
return head;
}
}
}
注意⚠️:head.next=removeElements(head.next,val);//这里容易漏掉head.next = 因为
二、83. 删除排序链表中的重复元素
给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。
示例 1:
输入: 1->1->2
输出: 1->2
示例 2:
输入: 1->1->2->3->3
输出: 1->2->3
对比203
只有if while里面的等式要改
var deleteDuplicates = function(head) {
var tmp = head;
let prev =head;
while(tmp != null&&tmp.next != null){//这里添加tmp != null 因为tmp可能是null,否者tmp.next会报错,而且判断倒数第二个数字是否会重复就可以了,最后一个不用考虑,tmp.next不是tmp=
//分析头部,并删掉头部的。
if(head.next.val == head.val){//这里等式条件要改,
head = head.next;
tmp = head;
prev =head;
}else{
if(tmp.val == tmp.next.val){//条件改成判断当前tmp和下一个是否相等
//如果中间的
prev.next = tmp.next;
tmp = tmp.next;
}else{
prev =(prev == tmp)?prev:prev.next;
tmp = tmp.next;
}
}
}
return head;
};