|
算法2.16
bool ListInsert ( SLink &L, int pos, ElemType
e )
{
//
若1≤pos≤LengthList(L)+1,则在指针L指向头结点的单链表
// 的第 pos 个元素之前插入新的元素
e,且返回函数值为 TRUE,
// 否则不进行插入且返回函数值为 FALSE
p=L; j=0;
while(p && j<pos-1)
{ //
查找第pos-1个结点,并令指针p指向该结点
p=p->next; ++j;
} // while
if(!p||j>pos-1)
return FALSE; //
参数不合法,pos 小于1或者大于表长+1
s=new LNode;
if (!s) exit(1); //
存储空间分配失败
s->data=e; //
创建新元素的结点
s->next=p-> next; p->next=s;
// 修改指针
return TRUE;
} // ListInsert
算法时间复杂度为O
(ListLength(L))。
|
|
算法2.16的演示效果如动画所示。
|
这里的变量初始化能否改为
"p=L->next; j=1;"? |
|
|
不行!因为插入时修改的是前驱结点的指针,因此算法中的目标是找第 pos
个结点的前驱,如果一开始,p 就指向第一个结点,那么当pos=1时就找不到它的前驱了。你想到了吗? |
|
|
如果单链表没有头结点,应该如何修改算法2.16? |
|
|
需对在第一个结点之前进行插入的情况单独进行处理。是不是很麻烦呀? |
|
算法时间复杂度的分析:
在插入算法中,修改指针的时间复杂度仅为O(1),但为了修改前驱结点的指针首先要找到这个结点,因此插入算法的时间主要消耗在查询结点上,因此,其时间复杂度和"存取元素"的操作相同。
|
|