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 
    15     }
    16 };

    关键点:

    (1)若链表前两个节点是重复的,一定需要维护头指针,否则,无需维护头指针; 如: 2->2->3->5

    (2)若链表末尾含有重复节点,一定要维护尾指针;如: 2->3->5->6->6

    (3)由于不知道节点重复次数,所以对于重复节点的删除要使用 while 或者递归。

    解题代码:

     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         if(pHead == nullptr)
    14             return nullptr;
    15 
    16         ListNode* preNode = nullptr;
    17         ListNode* pNode = pHead;
    18         while(pNode != nullptr){
    19             ListNode* pNext = pNode->next;
    20             bool needDelete = false;
    21             if(pNext != nullptr && pNode->val == pNext->val)// 注意:在使用节点的值之前一定要检查该节点是否存在
    22                 needDelete = true;
    23             // pNode节点与下一个节点不重复
    24             if(!needDelete){
    25                 preNode = pNode;
    26                 pNode = pNext;
    27             }
    28             // pNode节点与下一个节点重复
    29             else{
    30                 int data = pNode->val;
    31                 ListNode* pToBeDel = pNode;
    32                 while(pToBeDel != nullptr && pToBeDel->val == data){
    33                     pNext = pToBeDel->next;
    34                     delete pToBeDel;
    35                     pToBeDel = nullptr;
    36                     pToBeDel = pNext;
    37                 }
    38                 // 维护指针
    39                 // pNode之前的节点都含有重复
    40                 if(preNode == nullptr)
    41                     pHead = pNext;
    42                 // pNode之前的节点有不重复的
    43                 else
    44                     preNode->next = pNext;
    45                 // update
    46                 pNode = pNext;
    47             }
    48         }
    49         return pHead;
    50     }
    51 };
  • 相关阅读:
    opencv图像直方图均衡化及其原理
    转 让FPGA替代GPU的6大顾虑,你确定不看看吗?
    算法工程师到底在干嘛
    转 经典分类网络Googlenet
    darknet是如何对数据集做预处理的
    目标检测评价指标mAP 精准率和召回率
    opencv代码片段合集
    GAN简介
    【登录测试】登录模块的测试点
    【Jmeter自学】Jmeter里的指标
  • 原文地址:https://www.cnblogs.com/iwangzhengchao/p/9862417.html
Copyright © 2011-2022 走看看