> 文章列表 > 2.3.2单链表的插入删除

2.3.2单链表的插入删除

2.3.2单链表的插入删除

按位序插入(带头结点

 

 将第i-1个结点的指针指向第i个结点。

头节点看作是第0个结点。

 s->data=e  //设定s指针的数据域为e

s->next=p->next  //将p指针指向的位置赋值给s指针指向的位置

p->next=s     //再将s的数据域赋值给p指针指向的位置。

if i=1

头节点看作是第0个位置

如果先执行黄色的,再执行绿色的。 

翻车了吖

后面的链表全部都断开来了。

if i=3

 会执行while代码,

将p指针指向的位置即下个指针赋值给p。

(会执行两次)

 任务是找到第i-1个结点。

 将e插入到i-1个节点后面。

if i=5(插在表尾)

即插入到第4个结点后面

s->next= p->next指向的就是NULL,将他赋给s指向的指针。

p->next=s  再把s赋给p指向的指针。

此时的时间复杂度为O(n)

if i=6;

当j=5时

p为NULL,不满足而跳出循环

 

 i值不合法。

如果是不带头结点的,基本思路一致,只是当i=1时,需要特殊处理。

 

 

 

 if i==1(插在表头)

与其他插入的结点操作不同

 i>1时,后续逻辑和带头结点的一样。当然是从j=1开始的。

封装操作:

 后插操作的复杂度O(1)

指定节点的前插操作

 

 

按位序删除(带头结点)

 

 if i=4;(要删除第4个结点)

 e需要把被删除的值带回来

找到第3个结点

 

 当删除的是第一个位置的结点(时间复杂度为O(1))

最坏,平均时间复杂度为O(n)

 特殊情况下:
要删除的结点恰好是单链表的最后一个结点。

 p的后面是一个空指针。