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

删除链表中重复的结点

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;
    }
};
全部评论

相关推荐

拉丁是我干掉的:把上海理工大学改成北京理工大学。成功率增加200%
点赞 评论 收藏
分享
11-18 09:44
Java
小白也想要offer:简历别放洋屁,搞不还还放错了,当然你投外企除外,以上纯属个人观点
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务