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

删除链表中重复的结点

https://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) {
 
        
        if(pHead==nullptr||pHead->next==nullptr){
            return pHead;
        }
        ListNode * head=(ListNode *)malloc(sizeof(ListNode));
        head->next=pHead;

        ListNode * nxt=nullptr;
        ListNode * lft=pHead;
        ListNode * cur =pHead->next;
        ListNode * lleft=head;
        int rep=0;
        while(cur!=nullptr){
            if(lft->val!=cur->val){
                lft=lft->next;
                cur=cur->next;
                lleft=lleft->next;
                continue;
            }
            while(cur!=nullptr&&cur->val==lft->val){
                //del
                nxt=cur->next;
                free(cur);
                lft->next=nxt;
                cur=nxt;

            }
            free(lft);
            lleft->next=cur;
            if(cur==nullptr){
                break;
            }
            
            lft=cur;
            cur=cur->next;
        }

        ListNode * ret=head->next;
        free(head);
        return ret;
    }
};

//1.注意到,要删干净必须要记录left之前的一个节点。因此需要创建头结点

//2.注意处理边缘关系

2.1 只管lft和cur,nxt只在需要删减时计算,减少维护成本

2.2 lleft用于划定左边界

2.3 找到重复序列后,进入删除循环

2.4 删除循环结束后,删除left

2.5 开始重新初始化各个变量

2.5.1 lleft不变、如果没有节点,直接break->表现为cur=nullptr

2.5.2 如果有一个节点,lft=它,cur=nullptr,同样直接break

2.5.3 多个节点,又变成了更小规模的问题。lleft->lft->cur->xxx

先写清楚算法再开始

全部评论

相关推荐

KPLACE:首先是板面看起来不够,有很多奖,比我厉害。项目要精减,大概详细描述两到三个,要把技术栈写清楚,分点,什么算法,什么外设,怎么优化,不要写一大堆,分点,你写上去的目的,一是让别人知道你做了这个知识点,然后在面试官技术面的时侯,他知道你会这个,那么就会跟你深挖这个,然后就是个人评价改为专业技能
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务