zoukankan      html  css  js  c++  java
  • 【剑指Offer-代码的完整性】面试题18.2:删除链表中的重复节点

    题目描述

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

    思路

    用一个指针pre指向重复子链表的第一个节点的前一个节点,用另一个指针指向重复子链表的最后一个节点cur,这样遇到重复节点,使pre->next=cur->next就能把重复节点全部删除。因为整个链表都可能是重复的,所以需要一个指针指向头节点。代码如下:

    /*
    struct ListNode {
        int val;
        struct ListNode *next;
        ListNode(int x) :
            val(x), next(NULL) {
        }
    };
    */
    class Solution {
    public:
        ListNode* deleteDuplication(ListNode* pHead){
            if(pHead==nullptr || pHead->next==nullptr)
                return pHead;
            
            ListNode* head = new ListNode(-1);
            head->next = pHead;
            ListNode* pre = head;
            ListNode* cur = pHead;
            while(cur!=nullptr){
                if(cur->next!=nullptr && cur->val==cur->next->val){
                    while(cur!=nullptr && cur->next!=nullptr && cur->val==cur->next->val){
                        cur = cur->next;
                    }
                    pre->next = cur->next;
                    cur = cur->next;
                }
                else{
                    pre = pre->next;
                    cur = cur->next;
                }
            }
            return head->next;
        }
    };
    
  • 相关阅读:
    《痕迹识人,面试读心》培训总结之一
    傲游与视频网站广告之战的思考
    EMLS项目推进思考
    二级证丢失如何找回
    Mathematica 讲座
    泊松方程解法
    Windows核心编程-作业
    Win7多用户同时登陆
    C语言文件操作类型速查
    openMP的一点使用经验
  • 原文地址:https://www.cnblogs.com/flix/p/12577212.html
Copyright © 2011-2022 走看看