#链表——LeetCode刷题笔记
LeetCode 82、删除排序链表中的重复元素 Ⅱ
https://leetcode.cn/problems/remove-duplicates-from-sorted-list-ii/题目链接
对于返回头结点的题目 最好用预先指针、避免头指针变化。
这里新建一个节点,第二个节点为真正的head 返回ans.next 即可
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode deleteDuplicates(ListNode head) {
if(head == null || head.next == null){
return head;
}
// 对于要返回头结点的 考虑预先指针、新建节点并且第二个节点为真正的head
// 这里用的是新的指针
ListNode ans = new ListNode(0, head);
ListNode cur = ans;
while(cur.next != null && cur.next.next != null){
if(cur.next.val == cur.next.next.val){
int val = cur.next.val;
// 这里用一个变量val 来标识重复的数字会节省很多麻烦
// 后续只要比较后面的是否与这个数相等即可
while(cur.next != null && cur.next.val == val){
/*
注意这里的cur.next != null ,不要因为外面已成while有cur.next 这里就不写了;
注意循环的执行顺序;
这里循环体中的cur.next = cur.next.next 仍然可能出现超出范围的情况;
例如全部相同的情况 就会出现cur.next == null 的情况。
*/
cur.next = cur.next.next;
}
}else{
cur = cur.next;
}
}
return ans.next;
}
}