存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除链表中所有存在数字重复情况的节点,只保留原始链表中 没有重复出现 的数字。
返回同样按升序排列的结果链表。
示例 1:
输入:head = [1,2,3,3,4,4,5]
输出:[1,2,5]
示例 2:
输入:head = [1,1,1,2,3]
输出:[2,3]
提示:
链表中节点数目在范围 [0, 300] 内
-100 <= Node.val <= 100
题目数据保证链表已经按升序排列
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-list-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
对于一个节点来说,需要比较的它的前一个节点和后一个节点才可以知道它是不是重复的。
需要一个指针tail指向重复节点的前一个,因为重复的节点都需要删除。
1.如果当前节点head与下一个节点head.next值不同,说明当前的head就是我们需要的节点,那么加入新链表。
2.如果当前节点head与下一个节点head.next值相同,说明它们都不是我们想要的,我们需要找到第一个与head不同的值,找到了之后,保证的当前节点与前一个节点不同,我们需要让它判断是否和它下一个节点值相同,也就是执行下一次循环的1
1放在前面的原因是,第一个节点前面没有节点了,那它必然和前一个节点不同。
//因为第一个元素前面没有节点,为了统一操作我们创建一个 ListNode dummy = new ListNode(); ListNode tail = dummy; while(head!=null){ if(head.next==null || head.val != head.next.val){ //如果和下一个不同,说明这个就是我们需要的节点了 tail.next = head; tail = head; head = head.next; } else{ //如果相同,找到第一个与前一个节点不同的节点 while(head.next!=null && head.val == head.next.val) head = head.next; //这里出循环当前节点的值不等于后一个节点的值,找到了第一个与前面节点不同的值 head = head.next } } tail.next = null; //尾部置null return dummy.next;