题解 | #删除有序链表中重复的元素-II#

删除有序链表中重复的元素-II

http://www.nowcoder.com/practice/71cef9f8b5564579bf7ed93fbe0b2024

/**
 * struct ListNode {
 *	int val;
 *	struct ListNode *next;
 * };
 *
 * C语言声明定义全局变量请加上static,防止重复定义
 */
/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param head ListNode类 
 * @return ListNode类
 */
struct ListNode* deleteDuplicates(struct ListNode* head ) {
    // write code here
    if(head==NULL){
        return NULL;
    }
    
    
    struct ListNode* pre=NULL;
    struct ListNode* node=head;
    struct ListNode* next=node->next;
    
    while(node){//当前结点不为空的时候循环
        int flag=0;//设定一个标识,看当前结点是否重复,不重复是0,重复是1
        if(next){  //next不为空的时候,才能比较当前结点和next的值,否则会段错误
            while(node->val==node->next->val){//当当前节点的值等于下一个节点的值时
                flag=1;         //标识为1
                node->next=node->next->next; //剔除下一个结点,把当前结点直接和下一个节点的下一个结点链接
                if(node->next==NULL){//当node的next是空了,说明链表已经到结尾,直接跳出循环
                    break;
                }
            }

        }
        if(flag==1){ //标识为1,需要删除当前结点
            if(pre){ //如果pre存在,说明不是头结点
                pre->next=node->next;//pre的next直接指向当前节点的next,就是踢出了当前节点
            }else{ //如果pre不存在,说明当前节点是头结点
                head=node->next;//那么头结点就变为node的下一个结点
            }
        }else{ //如果标识为0,说明当前节点不需要删除
            pre=node;//pre变为当前节点
        }
        
        node=node->next; //当前节点取下一个结点
        if(node){ //当前节点已经变化,如果当前节点如果不是空,next即为当前节点指向的next
            next=node->next;
        }
    }
    return head;
}
全部评论

相关推荐

我已成为0offer的糕手:别惯着,胆子都是练出来的,这里认怂了,那以后被裁应届被拖工资还敢抗争?
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务