题解 | #删除有序链表中重复的元素-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;
}