单向链表需要考虑的问题:
1.空链表:头尾指针为空;
2.单结点链表:头尾指针指向相同;
3.多节点链表:操作结点位置在头结点和在非头节点的位置(一般需要两个指针,tail指针便于直接定位到链表末端,结点变换后需重置head、tail指针)
head应该保持指向链表头,遍历需用到临时指针变量。
增:
1.空链表:构造函数创建新节点,next指向nullptr;
2.前增: 构造函数用法 head = add_to_head(value , head);
创建新节点,令新节点的next指向原头,head指向新节点。
3.尾添: 创建新节点,tail->next = 该节点, 节点next = nullptr;
删:
(删除指定值的节点)
1.指定值存在:遍历查值,将前一节点指针指向下个节点,删除指向指定值节点。
在单向链表中若使用前一个节点的指针必须用两个指针遍历。
2.指定值不存在:
双向链表(可直接访问上个结点无需重新遍历)
循环链表:
tail->next = new IntSLLNode(el, *tail->next *); //创建一个指向头结点的指针
tail = tail -> next; // 重置尾指针
跳跃链表skip list
(可非顺序查找,但链表中的值必须排序,有点类似二分搜索,跳跃链表本质上进行了空间换时间,均摊时间复杂度)
跳跃列表是对有序的链表增加上附加的前进链接,增加是以随机化的方式进行的,所以在列表中的查找可以快速的跳过部分列表。
举个例子:我们将搜索37,这个时候会从最高级指针开始查找,即LEVEL2,发现37在30和53之间,再从37和53指针的下一级(LEVEL1)开始查找…再从30和45指针的下一级找到37。
如何实现跳跃链表:不会!!