题解 | #JZ76 删除链表中重复的结点#

删除链表中重复的结点

http://www.nowcoder.com/practice/fc533c45b73a41b0b44ccba763f866ef

//第一次遍历存储重复值,第二次遍历删除重复值

/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) :
        val(x), next(NULL) {
    }
};
*/
class Solution {
public:
    ListNode* deleteDuplication(ListNode* pHead) {
/*        ListNode *node=pHead, *nextNode, *preNode=nullptr;
        
        while (node) {
            nextNode = node->next;
            if (nextNode) {
                if (node->val != nextNode->val) {
                    if (preNode == nullptr) pHead = preNode = node;
                    else {
                        preNode->next = node;
                        preNode = node;
                    }
                } else {
                    while (nextNode && node->val==nextNode->val) {
                        node = nextNode;
                        nextNode = node->next;
                    }
                    if (nextNode == nullptr) {
                        if (preNode == nullptr) pHead = nullptr;
                        else preNode->next = nullptr;
                    }
                }
            }
            
            node = nextNode;
            if (node && node->next==nullptr) {
                if (preNode==nullptr) {
                    pHead = node;
                } else {
                    preNode->next = node;
                }
            }
        } */
        
        set<int> delVals;
        ListNode *node, *preNode;
        for (node=pHead, preNode=nullptr; node; node = node->next) {
            if (!preNode) preNode = node;
            else if (preNode->val == node->val)
                delVals.insert(node->val);
            
            preNode = node;
        }
        
        for (node=pHead, preNode=nullptr; node; node = node->next) {
            if (!delVals.count(node->val)) {
                if (!preNode) preNode = pHead = node;
                else preNode = preNode->next = node;
            } else if (node->next == nullptr && preNode) {
                preNode->next = nullptr;
            }
        }
        
        if (!preNode) pHead = nullptr;
        
        return pHead;
    }
};
全部评论

相关推荐

01-30 16:13
浙江大学 Java
点赞 评论 收藏
分享
01-12 17:45
门头沟学院 Java
叁六玖:这样的应该钱不多,以前我也被问,我在问他们实习公工资多少,一般都是2200-2800
找实习记录
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务