04.链表

2020-05-17  本文已影响0人  学海一乌鸦

1.定义

链表不需要连续的内存结构,它通过指针将一系列零碎的内存块串联起来。

image.png

2.分类

单链表

由结点(data)+后继指针(next)组成。


image.png

头结点:记录链表的基地址,有了它就可以遍历整个链表;
尾结点:指向的是一个空结点;
时间复杂度:
插入和删除:O(1)
查找,由于不支持随机访问O(n)

循环链表

尾结点指向的是头结点


image.png

双向循环链表

每一个结点,不仅有一个后继指针(Next)还有一个前驱指针(Prev)

image.png
双向链表由于储存了两个指针,所以占用的存储空间比较大,优势是支持双向遍历。
从结构上来看,双向链表支持O(1)复杂度的情况找到前驱结点,这样使双向链表在某些情况下比单链表的插入和删除更加高效

删除操作简析

删除无非有两个:

3.与数组的性能比较

4.技巧小结

技巧一:理解指针或引用的含义

指针或者引用指向的是下一个节点的内存地址;
将某个变量赋值给指针,实际上就是将这个变量的内存地址给这个指针;反过来,指针储存了这个变量的内存地址,那么,就能通过这个指针找到这个变量;

技巧二:警惕指针丢失和内存泄露

//注意二者的顺序
x.next=a.next;
a.next=x;

技巧三

利用哨兵简化思考难度,特别是对头尾节点的特殊考虑;

技巧四

重点留意边界条件处理
问几个几个问题?

技巧五:举例画图,辅助思考

上一篇 下一篇

猜你喜欢

热点阅读