zoukankan      html  css  js  c++  java
  • 剑指offer 删除链表中重复的结点

    题目描述

    在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5

    思路:直接处理

     1 /*
     2 struct ListNode {
     3     int val;
     4     struct ListNode *next;
     5     ListNode(int x) :
     6         val(x), next(NULL) {
     7     }
     8 };
     9 */
    10 class Solution {
    11 public:
    12     ListNode* deleteDuplication(ListNode* pHead)
    13     {
    14         ListNode *res = new ListNode(0), *tmp = res;
    15         ListNode *cur = pHead, *last;
    16         bool flag = false; //判断一个元素是否重复
    17         //从表头开始
    18         while (cur != NULL) {
    19             last = cur->next;
    20             flag = false;
    21             while ((last != NULL) && (cur->val == last->val)) {
    22                 last = last->next;
    23                 flag = true;
    24             }
    25             //如果有重复,那么cur指向下一个第一次不重复的节点
    26             if (flag) {
    27                 cur = last;
    28             } else {
    29                 tmp->next = cur;
    30                 tmp = cur;
    31                 //tmp->next = NULL; 千万注意不要在这里断掉,cur->next就会被置为NULL
    32                 cur = cur->next;
    33                 tmp->next = NULL;
    34             }
    35         }
    36         return res->next;
    37     }
    38 };

    以上代码内存未回收,更新版本如下:

     1 /*
     2 struct ListNode {
     3     int val;
     4     struct ListNode *next;
     5     ListNode(int x) :
     6         val(x), next(NULL) {
     7     }
     8 };
     9 */
    10 class Solution {
    11 public:
    12 
    13     ListNode* deleteDuplication(ListNode* pHead)
    14     {
    15         ListNode *res = new ListNode(0), *tmp = res; //res为表头,为方便链表一个节点重复的情况
    16         ListNode *cur = pHead, *last = nullptr, *pNode; //pNode指向要回收的节点
    17         bool flag = false; //判断某一个节点是否重复
    18         while (cur != nullptr) {
    19             flag = false;
    20             last = cur->next;
    21             while (last != nullptr && cur->val == last->val) {
    22                 pNode = last;
    23                 last = last->next;
    24                 
    25                 delete pNode;
    26                 pNode = nullptr;
    27                 
    28                 flag = true;
    29             }
    30             //如果有重复,那么cur指向下一个第一次不重复的节点
    31             if (flag) {
    32                 pNode = cur;
    33                 cur = last;
    34                 
    35                 delete pNode;
    36                 pNode = nullptr;
    37                 
    38             } else {
    39                 tmp->next = cur;
    40                 tmp = cur;
    41                 //tmp->next = NULL; 千万注意不要在这里断掉,cur->next就会被置为NULL
    42                 cur = cur->next;
    43                 tmp->next = nullptr;
    44             }
    45         }
    46         return res->next;
    47     }
    48 };

    递归解法

     1 class Solution {
     2 public:
     3     ListNode* deleteDuplication(ListNode* pHead)
     4     {
     5         if (pHead == NULL)
     6             return NULL;
     7         if (pHead != NULL && pHead->next == NULL)
     8             return pHead;
     9         ListNode *cur = pHead->next;
    10         if (cur->val == pHead->val) {
    11             cur = cur->next;
    12             while (cur && cur->val == pHead->val) {
    13                 cur = cur->next;
    14             }
    15             return deleteDuplication(cur);
    16         } else {
    17             pHead->next = deleteDuplication(cur);
    18             return pHead;
    19         }
    20     }
    21 };

     更新版本如下:

     1 /*
     2 struct ListNode {
     3     int val;
     4     struct ListNode *next;
     5     ListNode(int x) :
     6         val(x), next(NULL) {
     7     }
     8 };
     9 */
    10 class Solution {
    11 public:
    12     ListNode* deleteDuplication(ListNode* pHead)
    13     {
    14         if (pHead == nullptr) {
    15             return nullptr;
    16         }
    17         if (pHead != nullptr && pHead->next == nullptr) {
    18             return pHead;
    19         }
    20         ListNode *cur = pHead->next;
    21         if (cur->val == pHead->val) {
    22             ListNode *tmp = cur;
    23             cur = cur->next;
    24             delete tmp;
    25             tmp = nullptr;
    26             while (cur != nullptr && cur->val == pHead->val) {
    27                 ListNode *tmp = cur;
    28                 cur = cur->next;
    29                 delete tmp;
    30                 tmp = nullptr;
    31             }
    32             return deleteDuplication(cur);
    33         } else {
    34             pHead->next = deleteDuplication(cur);
    35             return pHead;
    36         }
    37     } 
    38 };
  • 相关阅读:
    Add Binary
    Unique Paths II
    APIcloud  SuperWebView
    微信小程序----checkbox组件
    PHP 使用redis  实现队列
    让PHP程序永远在后台运行
    微信小程序----switch组件(开关选择器)
    微信小程序----slider组件
    微信小程序----progress组件
    linux新的数据盘  分区,格式化后  挂载到目录
  • 原文地址:https://www.cnblogs.com/qinduanyinghua/p/10637104.html
Copyright © 2011-2022 走看看