class Solution {
public ListNode deleteDuplicates(ListNode head) {
if(head == null){return head;}
else{
ListNode cur = head;
while(cur.next != null){
if(cur.val == cur.next.val){
cur.next = cur.next.next;
}
else{
cur = cur.next;
}
}
return head;
}
}
}
正确结果
经常出现的问题:
1:第一个错误:nullpointerException
空指针异常
singleLink的特点
1:空不可以指向空,如果指向,则会报错,为空指针异常
如:
if(head == null && head.next == null){return head;}
很明显的错误
如果头节点为空,则不可以用空的头节点指向下一个节点
补充这句代码再逻辑上就是错的,编译一定会出错
如果头节点为空,那么头节点的指针指向根本没有开辟空间
会直接报错nullpointerException
图解:
空不能指向!
2:循环模式:我自认为分两组[while(){} while(){if(){}}]
如果只需要删除某个固定元素,则只需要删除即可,无需遍历链表
所以只需要一个
while(){}循环
如果需要遍历这个链表,则不可以值使用while循环,因为一旦有一个符合条件,while循环就自动跳出,无法遍历,所以
需要while(){
if(){}
}
while与if组合起来,while()是遍历的条件如cur.next != null
if()中是核心条件,如cur.next = cur.next.next(删除某一个节点)
3:
addtion:
双指针解法:
class Solution {
public ListNode deleteDuplicates(ListNode head) {
if(head == null){return head;}
else{
ListNode pre = head;
ListNode cur = head.next;
while(cur != null){
if(pre.val == cur.val){
pre.next = cur.next;//删除
cur = cur.next;
}
else{
pre = cur;
cur = cur.next;
}
}
return head;
}
}
}