单链表的删除
删除操作图示
a2的节点q,要实现q的删除,就是让他的前继节点p绕过a2直接指向后继节点a3。
p->next=p->next->next;
单链表第i个数据删除结点的算法思路:
1.声明结点p指向链表第一个结点,初始化j=1;
2.当j<i时,就遍历链表,让P的指针向后移动,不断指向下一个结点,j累加1;
3.若到链表末尾p为空,则说明第i个元素不存在;否则查找成功,将欲删除结点p->next赋值给q
4.单链表的删除标准语句p->next=q->next,将q结点中的数据赋值给e,作为返回;释放q结点。
typedef int Status;
//可以用C语言结构指针来描述单链表:
typedef struct Node
{
ElemType data; //数据城
struct Node*Next;//指针域
}Node :
typedef struct Node* LinkList;
LinkList p;
Status DeletElemLinklist(LinkList l,int i, int e)
{
int j;
LinkList s;
p=p->Next; //p指向表头
for (j = 1; j < i; ++j)
{
p=p->Next; //p指向第i个节点
if (p==Null)
{
return err;
}
}
p->Next =p->Next->Next;
free(p);
e=p->Next->data;
return success;
}
无论是单链表插入还是删除算法,它们都是由两个部分组成:第一部分就是遍历查找第i元素,第二部分就是实现插入和删除元素。从整个算法来说,我们很容易可以推出他们的肘间复杂度都是0(n)。再详细点分析:如果在我们不知道第i个元素的指针位置,单链表数据结构在插入和删除操作上与线性表的顺序存储结构是没有太大优势的。
但如果,我们希望从第i个位置开始,插入连续10个元素,对于顺序存储结构意味看,每一次插入都需要移动n-i个位置,所以每次都是0(n)。而单链表,我们只需要在第一次时,找到第i个位置的指针,此时为0(n),接下来只是简单地通过赋值移动指针而已,时间复杂度都是0(1)。显然对于插入或删除数据越频繁的操作,单链表的效率优势就越是明显