|
算法2.17
bool ListDelete ( SLink &L, int pos, ElemType
&e)
{
//
若1≤pos≤LengthList(L),则删除指针L指向头结点的单链表
// 中第 pos 个元素并以 e 带回其值,返回函数值为
TRUE,
// 否则不进行删除操作且返回函数值为
FALSE
p = L; j = 0;
while (p->next && j < i-1)
{ //
寻找第pos个结点,并令p指向其前驱
p = p->next; ++j;
}
if (!(p->next) || j > i-1)
return FALSE; //
删除位置不合理
q = p->next; p->next = q->next; //
修改指针
e = q->data; delete(q); //
释放结点空间
return TRUE;
} // ListDelete_L
算法时间复杂度为O
(ListLength(L))。
|
|
|
你是否注意到了,在删除算法中参数不合理的判断条件和插入的情况不同?为什么? |
|
|
因为对插入而言,只要"前驱"存在即可,而对删除而言,不仅"前驱"要存在,被删结点也必须存在。你是否也想到了? |
|
|
如果单链表没有头结点,应该如何修改算法2.17? |
|
|
需对删除第一个结点的情况进行单独处理。你一定也想到了,因为和插入是一样的问题,对吧? |
|
算法时间复杂度的分析:
显然,和插入一样,其时间消耗在查询前驱结点上。 |
|