题目

给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字。

示例 1:

输入: 1->2->3->3->4->4->5
输出: 1->2->5
示例 2:

输入: 1->1->1->2->3
输出: 2->3

解析

哑节点避免开头的特殊情况

代码

  1. /**
  2. * Definition for singly-linked list.
  3. * struct ListNode {
  4. * int val;
  5. * ListNode *next;
  6. * ListNode(int x) : val(x), next(NULL) {}
  7. * };
  8. */
  9. class Solution {
  10. public:
  11. ListNode* deleteDuplicates(ListNode* head) {
  12. ListNode* dummy = new ListNode(0);
  13. dummy->next = head;
  14. ListNode* pre = dummy;
  15. ListNode* cur = pre->next;
  16. while (cur) {
  17. int num = 0;
  18. ListNode* p = cur;
  19. while (p && p->val == cur->val) {
  20. ++num;
  21. p = p->next;
  22. }
  23. if (num > 1) {
  24. pre->next = p;
  25. } else {
  26. pre = cur;
  27. }
  28. cur = p;
  29. }
  30. ListNode* retNode = dummy->next;
  31. delete dummy;
  32. return retNode;
  33. }
  34. };