思路:
使用两个指针p和q来遍历链表,并通过比较结点的数据来删除重复结点。
首先,将p指针指向链表的头结点。然后,进入第一个循环,该循环用于遍历链表中的每个结点。在循环中,将q指针指向当前结点p,并进入第二个循环。
第二个循环用于遍历当前结点之后的所有结点。在循环中,首先比较p结点的数据的绝对值与q结点的下一个结点的数据绝对值是否相等。如果相等,说明存在重复结点。此时,将s指针指向重复结点,然后将q结点的next
指针指向下一个结点,即跳过重复结点。最后,释放重复结点的内存。
如果p结点的数据与q结点的下一个结点的数据不相等,说明没有重复结点,将q指针移动到下一个结点。
完成内循环后,将p指针移动到下一个结点,然后继续外循环,直到遍历完整个链表。
核心代码:
//删除链表中绝对值相同的结点,仅保留第一次出现的结点
void Delete(LinkList &L){
LNode *p,*q,*s;
p=L->next;
while(p!=NULL && p->next!=NULL){
q=p;
while(q->next!=NULL){
if(abs(p->data)==abs(q->next->data)){
s=q->next;
q->next=s->next;
free(s);
}else{
q=q->next;
}
}
p=p->next;
}
}