算法分析
删除有序链表中所有的重复元素,采用两个指针p和q遍历链表删除的方法,另外设置一个指针指向p指针的前一个节点。需要考虑重复元素在头节点和尾节点的特殊情况。
c++代码
//移除有序链接中重复的元素
void LinkList::RemoveAllRepeatData()
{
//如果链表为空或者只有一个元素,直接返回
if(head == NULL || head->next == NULL)
{
return;
}
//使用两个指针进行比较
Node* p = head;
Node* q = head->next;
//p的前一个节点
Node* pPre = head;
while(p != NULL && q != NULL)
{
if(p->data == q->data)
{
do
{
q = q->next;
length--;
}
while(p->data == q->data && q->next != NULL);
//如果p是头节点,q是尾节点
if(p == head && q->next == NULL)
{
head = NULL;
return;
}
//如果p是头节点
if(p == head)
{
head = q;
p = q;
pPre = q;
q = q->next;
}
else if (q->next == NULL)//q是尾节点
{
pPre->next = NULL;
break;
}
else
{
//删除p到q的前一个节点之间的节点
pPre->next = q;
p = q;
q = q->next;
}
}
else
{
pPre = p;
p = p->next;
q = q->next;
}
}
}