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的后面是一个空指针。



