按位序插入(带头结点)
将第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的后面是一个空指针。