1.3 单链表的操作

b站笔记(如侵删)

1.单链表的插入操作

在第i个结点之前插入一个元素e。

分析:首先插入e,用一个结点p存放e,结点的next域指向Ai,Ai-1指向结点p

           寻找插入的位置,在第i-1个元素之后插入,考虑空间问题。

            1. p->next  = q->next;

           2. q->next = p;

Stauts ListInsert_L(LinkList &L,int L,ElemType e)
{//在线性链表的第I个元素之前插入一个元素e
p = (LinkList)malloc(sizeof(LNode)); //申请存储空间
if(!p) exit(OVERFLOW); //没有就退出
P->data =e;  //p的数据域赋值
q=L;
j=0;//q 初始化为L,q初始化为0;
while(q && j<i-1){q=q->next;++j;} //第i-1个元素
if(!q||j>i-1) return ERROR;
P ->next= q->next=p;//关键点
return OK;
}//ListInsert_L;

时间复杂度分析:O(n)

练习:1.删除单链表中节点的算法,并分析时间复杂度

           2.单链表的i定位算法,分析时间复杂度

 

LNode *LocateElem_L(LinkList L,ElemTye e)
{
//在L中找到第一个值和e相同的节点,返回其地址,若不存在,返回空值
if(!L)rerurn NULL;
P=L;
while(P && P->data!=e) p = ->next;
return p;
}
时间复杂度:O(n)

2.线性链表的复杂操作(难)

例:将两个有序链表归并为一个新的有序链表。分析:将Lb中的元素插入到La,使其有序。

      分析:pa指向La的第一个元素,Pb指向Lb的第一个元素,找到La中第一个比他小插入

     P记录Pa的前面的元素,Pa总是第一个比Pb当前元素大的哪一个元素,Pa之前的元素才是最后一个比当前元素小的那一个元素,Pb插入到P之后,Pb插入之前首先把插入的元素记录下来,记为q,然后把q插入到P之后,

1.3 单链表的操作