题目描述
存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除链表中所有存在数字重复情况的节点,只保留原始链表中 没有重复出现 的数字。
返回同样按升序排列的结果链表。
样例描述
思路
画图 + 保存重复的变量
- 要舍得使用变量记录重复值,不然会被链表指针绕晕。
- 增加一个虚拟的头结点处理边界问题。
代码
/**
* 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;
ListNode dummy = new ListNode(-1);
dummy.next = head;
ListNode cur = dummy;
//必须保证当前结点的后两个都不为空
while (cur.next != null && cur.next.next != null) {
if (cur.next.val == cur.next.next.val) {
//记录下重复的值,然后后面删除所有等于这个值的结点
int x = cur.next.val;
while (cur.next != null && cur.next.val == x) {
cur.next = cur.next.next;
}
}
//不相同的话,就移动cur到下一个位置
else {
cur = cur.next;
}
}
return dummy.next;
}
}