问答题 如何实现单链表的插入、删除操作
【正确答案】
【答案解析】插入运算是将值为x的新结点插入到单链表的第i个结点的位置上,即插入到ai-1与ai之间。具体算法如下:
1)找到ai-1存储位置p。
2)生成一个数据域为x的新结点*s。
3)令结点*p的指针域指向新结点s。
4)新结点s的指针域指向结点ai。
图3所示为单链表插入结点示意图。

图3 单链表插入结点示意图

单链表插入结点具体算法实现如下:
Status InsertList(LinkList head,DataTypex,int i)
{
ListNode *p;
p=head;
int j=1;
while(p&&j<i)
{
p=p->next;
++j;
}
if(!p)‖j>i)
{
printf("Position Error");
retum ERROR;
}
s=(ListNode*)malloc(sizeof(ListNode));
s->data=x;
s->next=p->next;
P->next=s;
return OK;
}
单链表插入算法的时间主要耗费在查找操作GetNode,即获得结点上,故单链表插入操作的时间复杂度为O(n)。
单链表的删除操作是将单链表的第i个结点删去。其具体步骤如下:
1)找到ai-1的存储位置P(因为在单链表中结点ai的存储地址是在其直接前趋结点ai-1的指针域next中)。
2)令p→next指向ai的直接后继结点(即把ai从链上摘下)ai+1。
3)释放结点ai的空间,将其归还给“存储池”。
图4所示为单链表删除结点示意图。