第一部分 --- 线性表的链式表示和实现(12,13)
1.创建一个头指针和头指针指向的头结点
2.创建一个我们要插入的结点
3.进行插入
4.重复2,3步直到插入完毕
1.被挡住的部分是后插法
2. r 是尾指针,L 是头指针
1.创建一个头指针,然后在堆区中通过new的方式创建一个头结点,并用头指针接收new后返回的地址,让头指针指向头结点,然后通过头指针让头结点的指针域为空指针,最终创建好一个空链表
2.创建一个尾指针,并让尾指针也指向头结点
3.在循环中创建新的结点,并以尾插的方式向链表中插入结点
(通过尾指针 r 进行操作并让尾指针不断移动)
第二部分 --- 循环链表
1.注意!循环链表是尾结点的指针域是指向头结点,而不是指向首元结点!!
2.循环链表的空表表示方法是:头结点的指针域指向它本身
1.对于循环链表而言,头结点的上一个结点就是链表的尾节点
2.判断链表读完(循环结束)时有两种情况:一种是我们读到了尾结点,循环结束,此时p->next就等于头指针L(头指针是指向头结点的指针);还有一种是我们读到了头结点,此时也就代表我们读完了尾结点,整个链表被读完了,此时P = 头指针L
1.在循环链表中我们常用的不是头指针而是尾指针,尾指针是指向链表尾结点的指针
2.在循环链表中通过尾指针找到首元结点的时候我们只需要先找到头结点,然后再通过头结点找到首元结点就可以了(在循环链表中尾结点的指针域指向头结点)
至于找到尾结点就更方便了,尾指针本身指向的就是尾结点
1.注意:第二步中的表头指的是首元结点
2.循环链表用尾指针来表示,单向链表用头指针来表示
第三部分 --- 双向链表
1.双向链表的特点就是一个结点具有两个指针域。一个指针域用来指向结点的直接前驱(前一个结点),一个指针域用来指向结点的直接后继(后一个结点)
2.双向链表中的头结点中指向上一个结点的指针域为空指针,尾结点中指向下一个结点的指针域为空指针
3.双向链表的空表表示是:头结点的两个指针域都为空
1.所谓的对称性就是指:一个指针P指向双向链表中的一个结点,则这个指针P = 结点的前驱的后继指针域 = 结点的后继的前驱指针域
1.让a结点成为x结点的前驱
2.让x结点成为a结点的后继
3.让b结点成为x结点的后继
4.让x结点成为b结点的前驱
1.上面这个算法中直接调用了查找链表中的元素的算法 --- GetElemP_Dul ( ),找到元素后我们开始进行插入,如果没找到,证明输入错误,直接返回Error
2.插入结点前需要我们先创建结点
调整完删掉结点后的前驱和后继关系,我们还需要被删掉的结点销毁(释放堆区内存空间)
1.如果有需要的话我们可以自己创建一个e变量来存储被删掉的结点的数据
2.由于使用了查找算法,所以算法最终的时间复杂度是O(n)
第四部分 --- 单链表,循环链表和双向链表的时间效率比较
1.双向循环链表其实就是在用空间换时间(增加一个指针域换取时间效率的提高)