• 剑指offer:删除链表中重复的结点


    题目描述:

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

    思路分析:

    要考虑两种情况,链表中结点为0或1,此时直接返回原链表;第二种情况就是链表中包含两个及以上的结点。

    解决第一种情况直接进行一个判断即可,第二种情况,需要定义三个指针pre, cur, nex来解决。其中为了最终返回链表头指针,需要额外定义一个指针,指向链表头。这里定义这个指针为newhead,newhead的next为给定链表的头。接下来令pre指向newhead,cur指向pHead,nex指向pHead->next。接下来进行判断,当cur->val==nex->val时,继续向后循环遍历,直到nex->val大于cur->val,此时pre->next=nex;当cur->val<nex->val时,即满足条件,向后继续遍历,那么pre=cur, cur=cur->next。

    代码:

     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 || pHead->next==nullptr)
    15             return pHead;
    16         else
    17         {
    18             ListNode* newhead = new ListNode(-1);
    19             newhead->next = pHead;
    20             ListNode* pre=newhead;
    21             ListNode* cur=pHead;
    22             ListNode* nex=pHead->next;
    23             while(cur!=nullptr && cur->next!=nullptr)
    24             {
    25                 if(cur->val==nex->val)
    26                 {
    27                     while(nex!=nullptr && cur->val==nex->val)
    28                     {
    29                         ListNode* tmp = nex;
    30                         nex = nex->next;
    31 
    32                         delete tmp;
    33                         tmp = nullptr;
    34                     }
    35                     pre->next = nex;
    36                     cur = nex;
    37                 }
    38                 else
    39                 {
    40                     pre = cur;
    41                     cur = cur->next;
    42                 }
    43                 nex = nex->next;
    44             }
    45             return newhead->next;
    46         }
    47     }
    48 };
  • 相关阅读:
    Linux概念与体系阅读笔记
    iOS缓存
    iOS开发笔记系列-基础3(多态、动态类型和动态绑定)
    在进入新版本 的时候,进行推送引导
    手机号验证
    通过UIView对象获取该对象所属的UIViewController(转)
    支付宝和微信支付的各种填坑
    IOS开发简单登录LoginViewController、注册RegisterViewController、UcenterViewController功能实现方法
    iOS 注册登录页面
    多媒体元素的使用
  • 原文地址:https://www.cnblogs.com/LJ-LJ/p/11066936.html
Copyright © 2020-2023  润新知