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

    题目描述

    在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
    思路:这题首先熟悉哨兵节点的用法。自己对模板还是没有很好的节点。
    //哨兵节点
    ListNode dummyNode(-1);
    dummyNode.next = head;
    head = &dummyNode;
    /*理解:这样写的好处可以自动回收多余的这个节点,因为是一个对象,所以使用一个.运算符。接下来的head是一个指针,所以需要取dummyNode的地址。
    第二行将哨兵节点的next指向当前head,然后将head移动到哨兵节点,这样做的好处是,可以修改之后结点的指向,如果没有这句,那么处理的时候会写
    head = head -> next,这样只能移动指针,不能改变指针的指向。
    */

    考虑问题要思考:

    先分情况,当前节点和next节点相等的时候,保存当前节点值,只要和当前节点值一样就一直往下next,如果不相等就直接转移到下一节点。

    相似题目:Remove Duplicates from Sorted List

    /*
    struct ListNode {
        int val;
        struct ListNode *next;
        ListNode(int x) :
            val(x), next(NULL) {
        }
    };
    */
    class Solution {
    public:
        ListNode* deleteDuplication(ListNode* pHead){
            if(pHead == nullptr){
                return nullptr;
            }        
            ListNode* head = pHead;
            ListNode dummyNode(-1);
            dummyNode.next = head;
            head = &dummyNode;        
           
            while(head->next != nullptr&& head->next->next != nullptr){
               if(head->next->val == head->next->next->val){
                   int tmp = head->next->val;
                   while((head->next != nullptr) &&(tmp == head->next->val)){
                       head->next = head->next->next;
                   }
               }
                else{
                    head = head->next;
                }
            }        
            return dummyNode.next;
        }
    };
  • 相关阅读:
    Network (poj1144)
    C. Hongcow Builds A Nation
    ZYB loves Xor I(hud5269)
    D. Chloe and pleasant prizes
    Game(hdu5218)
    约瑟夫环的递推方法
    Misaki's Kiss again(hdu5175)
    Exploration(hdu5222)
    B. Arpa's weak amphitheater and Mehrdad's valuable Hoses
    C. Arpa's loud Owf and Mehrdad's evil plan
  • 原文地址:https://www.cnblogs.com/dingxiaoqiang/p/8302778.html
Copyright © 2011-2022 走看看