c语言经典算法题:删除无序链表重复值
实现方法(一)
算法思想:定义一个指针cur,指向当前没有重复元素的那部分的下一个元素,pre指向cur的前驱,比如2→3→2→5→4→3→7→6→7为当前链表的形状,刚开始cur指向3,pre指向2,定义一个工作指针runner,每次从head开始向后扫描,扫描到cur就退出循环,如果在到cur之前遇到一个节点的值与cur指向节点的值相同,那么删除cur指向节点,跳出循环(确保runner遍历过的范围无重复值),又开始新一轮循环,如果扫描到cur的时候才停止循环,说明前面没有重复的节点,更新当前节点和它的前驱:pre = cur; cur = cur->next;
核心代码:
LinkNode* cur, * pre;
//只有一个节点的情况(略)
//不止一个节点的情况
pre = h;
cur = h->next;
while(cur){
runner = h; //runner从h开始遍历
while(runner != cur){
//有重复值就删
if(cur->data == runner->data){
pre->next = cur->next;
free(cur);
cur = pre->next;
//确保runner遍历过的范围无重复值
break;
}
runner = runner->next;
}
//无重复值更新cur和pre
if(runner == cur){
pre = cur;
cur = cur->next;
}
}