今天的朋友圈,在下雪❄️❄️。
学习内容来自微信公众号:码农有道 ——《【数据结构与算法】面试之链表问题集锦》
1. 判断链表是否为空
- 前提带有头节点head的链表
- 单向链表:head->next == null
- 单向循环链表:head->next == head
- 双向链表:(head->next == head) && (head->pre == head)
2. 删除链表节点,时间复杂度要求为O(1)
(1)若要满足时间复杂度为O(1),需有以下几个前提:
- 被删节点的存储地址是已知的;
- 若是单向链表,由于单向链表对于前向节点未知,因此被删节点不能是最后一个节点。
(2)思想:用下一个节点数据覆盖要删除的节点的数据,然后删除下一个节点。
3. 单向链表转置
(1)思想:用三个临时指针pre,cur,next在链表上循环遍历。
(2)关键代码:
while(null != cur)
{
next = cur->next;
cur->next = pre;
pre = cur;
cur = next;
}
4. 判断一个单向链表是否有环及环入口
(1)思想:
- 用一个快指针fast和慢指针slow,快指针fast一次走两步,慢指针一次走一步。
- 若链表无环,则快指针先到达链尾,fast->next == null。
- 若链表有环,则快指针与慢指针一定会相遇。(归纳法可证明)
- 若链表有环,快慢指针相遇的地点距环入口的距离x与头节点head到环入口的距离d一致。
(2)关键代码:
while((null != fast) && (null != fast ->next))
{
fast = fast ->next->next;
slow = slow->next;
if(fast == slow)
{
break;
}
}
if(null == fast)
{
// 有环
return true;
}
if (fast == slow)
{
while(head != slow)
{
head = head->next;
slow = slow->next;
}
return slow;
}
5.判断两个链表是否相交
(1)相交:指两个链表存在共用的节点,即节点的地址、值域、链域都相同。
(2)若相交,相交后,后面的节点全部共用。
(3)链表不带环:若链表相交,则两个链表的最后一个节点一定相同。
(4)链表带环:若链表相交,则两个链表一定共环。
(5)思想:先判断链表是否带环,若不带环,判断链表最后一个节点是否相同;若带环,判断一个链表环中的节点是否在另一个链表中存在。