单链表在不知头结点的情况下对第i个元素的删除

时间:2023-03-08 20:50:49

一、首先,看看单链表中第i个元素的删除:

Status ListDelete_L (LinkList &L,int i,ElemType &e){

//在带头结点的单链表L中,删除第i个元素,并由e返回其值

p=L;j=0;

while(p->next&&j<i-1){                     //寻找第i个结点,并令p指向其前驱

p=p->next;

++j;

}

if(!(p->next)||j<i-1)return ERROR;  //删除位置不合理

q=p->next;p->next=q->next;          //删除并释放结点

e=q->data;free(q);

return OK;

}

例如对单链表L中第3个元素C的删除,即对第4个结点删除:

1) 最开始时P指针指向头结点,j=0;

单链表在不知头结点的情况下对第i个元素的删除

2) 执行循环语句,当j=2时,p指向第三个结点,循环结束;

单链表在不知头结点的情况下对第i个元素的删除

3) q=p->next;p->next=q->next; 删除并释放结点;

单链表在不知头结点的情况下对第i个元素的删除

则实现了C结点的删除。

二、单链表在不知头结点的情况下对第i个元素的删除:

例如对B结点的删除,最开始只知道指向B结点的指针q,因为是单链表,不能获取到前驱指针,所以不能用上面的方法进行删除。

单链表在不知头结点的情况下对第i个元素的删除

可以用下面的语句实现q结点的删除:

q->data=q->next->data;

q->next=q->next->next;

此时,L单链表变为:

单链表在不知头结点的情况下对第i个元素的删除

虽然删除的是C结点,但它把C中的数据复制到B中,相当于删除了B结点。

但要注意的是,这种删除方法不能删除位于表尾的结点,因为他的后面再没有别的结点可以替换。