16. 线性表的链式表示和实现(5)
本节主要介绍单链表的复杂算法(删除,头插法建立单链表)实现。
本文部分ppt、视频截图来自:[青岛大学-王卓老师的个人空间-王卓老师个人主页-哔哩哔哩视频]
1. 单链表的复杂操作
- 删除——删除第 i 个节点
【算法步骤】
- 首先找到 ai-1 的存储位置p,保存要删除的 ai 的值。
- 另p->next 指向ai+1。
- 释放结点 ai 的空间。
【删除算法描述】
//将线性表L中第i个数据元素删除
Status ListDelete_L(LinkList &L,int i,ElemType &e){p = L;j = 0;//寻找第i个结点,并令p指向其前驱while(p -> next && j < i-1){p = p->next;++j;}if(!(p->next)||j>i-1) return ERROR; //删除位置不合理的q = p -> next; //临时保存被删结点的地址以备释放p -> next = q -> next; //改变删除结点前驱结点的指针域e = q -> data; //保存删除结点的数据域delete q; //释放删除结点的空间
return OK;
}//ListDelete_L
- 单链表的建立——头插法
头插法:元素插入在链表头部,也叫前插法。(算法时间复杂度:O(n))
- 从一个空表开始,重复读入数据;
- 生成新结点,将读入数据存放到新结点的数据域中;
- 从最后一个结点开始,依次将各结点插入到链表的前端,如下图,要建立链表L(a,b,c,d,e),按(e,d,c,b,a)的顺序插入。
【算法描述】
void CreateList_H(LinkList &L,int n){L = new LNode;L -> next = NULL; //先建立一个带头结点的单链表for(i = n;i > 0;--i){p = new LNode;//生成新结点cin >> p -> data;//输入元素值p -> next = L -> next; //插入到表头L -> next = p;}
} //CreateList_H