zoukankan      html  css  js  c++  java
  • 力扣算法题—082删除排序链表中的重复元素2

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

    示例 1:

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

    示例 2:

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

      1 #include "_000库函数.h"
      2 
      3 
      4 struct ListNode {
      5     int val;
      6     ListNode *next;
      7     ListNode(int x) : val(x), next(NULL) {}
      8 };
      9 
     10 
     11 //又是无头结点的链表!!!
     12 //还有,哪个数字重复了,就将他全部删除!!
     13 class Solution {
     14 public:
     15     ListNode* deleteDuplicates(ListNode* head) {
     16         //创建一个头结点
     17         ListNode *p = new ListNode(0);
     18         p->next = head;
     19         head = p;
     20         ListNode *q = p;
     21         int flag = 0;//用来标记重复数字
     22         while (q && p) {
     23             q = q->next;
     24             while (q && q->next && q->val == q->next->val) {
     25                 //一定的记得释放删除的数字
     26                 ListNode *ptr = q;
     27                 p->next = q->next;
     28                 delete(ptr);
     29                 ptr = NULL;
     30                 q = p->next;
     31                 flag = 1;
     32             }
     33             if (flag) {//删除最后一个重复了的数字
     34                 ListNode *ptr = q;
     35                 p->next = q->next;
     36                 delete(ptr);
     37                 ptr = NULL;
     38                 q = p;
     39                 flag = 0;
     40             }
     41             else
     42                 p = p->next;
     43         }
     44         return head->next;
     45     }
     46 };
     47 
     48 //不释放删除的节点,我不建议,但好多博客是这样写的
     49 class Solution {
     50 public:
     51     ListNode* deleteDuplicates(ListNode* head) {
     52         //创建一个头结点
     53         ListNode *p = new ListNode(0);
     54         p->next = head;
     55         head = p;
     56         ListNode *q = p;
     57         while (p->next) {
     58             q = p->next;
     59             while (q->next && q->val == q->next->val)
     60                 q = q->next;
     61             if (p->next != q)
     62                 p->next = q->next;
     63             else
     64                 p = p->next;
     65         }
     66         return head->next;
     67     }
     68 };
     69 
     70 
     71 
     72 //使用递归,不使用while
     73 
     74 class Solution {
     75 public:
     76     ListNode *deleteDuplicates(ListNode *head) {
     77         if (!head) return head;
     78         if (head->next && head->val == head->next->val) {
     79             while (head->next && head->val == head->next->val) {
     80                 head = head->next;
     81             }
     82             return deleteDuplicates(head->next);
     83         }
     84         head->next = deleteDuplicates(head->next);
     85         return head;
     86     }
     87 };
     88 void T082() {
     89     ListNode *head = new ListNode(0);
     90     ListNode *p = head;
     91     vector<int>v = { 1,2,3,4,4, 5, 5};
     92     for (auto a : v) {
     93         ListNode *q = new ListNode(0);
     94         q->val = a;
     95         p->next = q;
     96         p = q;
     97     }
     98     p = head->next;
     99     while (p) {
    100         cout << p->val << "->";
    101         p = p->next;
    102     }
    103     cout << endl;
    104     Solution s;
    105     p = s.deleteDuplicates(head->next);
    106     while (p) {
    107         cout << p->val << "->";
    108         p = p->next;
    109     }
    110     cout << endl;
    111 }
  • 相关阅读:
    day50 初识JavaScript
    在C#中对Datatable排序【DefaultView的Sort方法】
    Windows Phone 中查找可视化树中的某个类型的元素
    抽象类(abstract)是否可以继承自实体类 ?
    C#遍历指定目录下的所有文件及文件夹
    Log4Net总结
    Firefox 与 IE 对Javascript和CSS的区别
    RSS 订阅
    Win8 URI 方案 ms-appX 用法大全
    ProgressIndicator显示进度条以及一些文字信息
  • 原文地址:https://www.cnblogs.com/zzw1024/p/10730185.html
Copyright © 2011-2022 走看看