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

删除链表中重复的结点

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

基本思想是遍历链表,当下一个结点的值与本结点相同时,继续查看下一个结点,直到找到一个结点与本结点的值不同,将上一结点的next域指向不同的结点,从而完成将重复结点从链表中去除的需求。
需要注意的是,当列表头结点重复时需要特殊处理。一半的代码都是头结点的特殊处理,有能力的朋友可以尝试优化代码结构。

/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) :
        val(x), next(NULL) {
    }
};
*/
class Solution {
public:
    ListNode* deleteDuplication(ListNode* pHead) {
        ListNode* p = pHead;
        ListNode* pre= pHead;
        ListNode* result = pHead;
        while(p){
            ListNode* tod = p;
            bool isRe = false;
            while(tod->next && tod->next->val == p->val){
                isRe = true;
                tod = tod->next;
            }
            if(isRe){
                if(p == pHead || pre == nullptr || p == pre){
                    pre = tod->next;
                    result = tod->next;
                }
                else{
                    pre->next = tod->next;
                }
                isRe = false;
                p = tod->next;
            }
            else{
                pre = p;
                p = p->next;
            }
        }
        return result;
    }
};
全部评论

相关推荐

认真搞学习:28小登的建议,投算法岗不要写什么物理竞赛,互联网+,多写点项目,用什么算法做了什么。还有本科算法是不可能的开发你这个也没有项目啊
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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