一、链表(linked list)特性:
- 链表是一种真正的动态的数据结构;(head、next)
- 链表的数据结构属于线性结构,但是存储结构属于链式存储结构,非顺序存储,而是每个节点(node)里存下一个节点的指针
- 使用链表可以克服数组需要预先知道数据大小的缺点,可以存储不同的数据类型,但是增加了指针域,空间开销大
- 链表允许在链表任意位置插入node或移除node,但是不允许随机存取
- 链表有很多类型:单向链表、双向链表及循环链表
二、单链表定义:
注:在《数据结构与算法分析》这本书中,线性结构用的是结点,而非线性结构中用的都是节点;混用也无妨。
- 链表的数据以结点(node)来表示
- 每个结点由
元素(E e) + 指针(Node next)
构成,元素的存储单元,指针连接其他结点的地址数据 - 以结点的序列表示线性表称为线性链表(单链表),单链表是链式存储结构
三、单链表的操作:
1.头部add:
node.next=head;
head=node;
2.中部add:
node.next=prev.next;
prev.next=node;
3.单链表的虚拟头结点:
头结点不储存数据,只储存第一个结点的指针(地址);这样链表的新增、删除就不必区分位置是在头还是中间;
4.单链表curd的时间复杂度:
四、腾讯面试题-链表翻转:
思路我们以空间换时间,再定义一个空链表list2,借助list2进行翻转
思路一:循环取list1的尾节点,插入list尾部,时间复杂度为o(n!),不太好
思路二:遍历list1的节点,插入list头部,最后将list1的head.next指向list2的head.next,时间复杂度为o(n),推荐
五、案例——leetcode103题:
思路一:时间换空间,遍历链表,不等于6的尾插到新链表
思路二:递归,一道6返回原来,不是6返新
六、环形链表-约瑟夫问题:
1.定义:
引入尾节点tail,将链表的最后一个结点的next指向头结点head。
2.约瑟夫问题:
数据结构与算法更多相关内容【持续更新中】:
- 【数据结构与算法一:时间频度和时间复杂度】: 传送门.
- 【数据结构与算法二:数组】: 传送门.
- 【数据结构与算法三:栈和队列】: 传送门.
- 【数据结构与算法四:链表】: 传送门.
- 【数据结构与算法五:哈希表-哈希函数设计原则-哈希冲突解决方案】: 传送门.