数据结构学习笔记 —— 链表问题

今天的朋友圈,在下雪❄️❄️。
学习内容来自微信公众号:码农有道 ——《【数据结构与算法】面试之链表问题集锦》
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)思想:先判断链表是否带环,若不带环,判断链表最后一个节点是否相同;若带环,判断一个链表环中的节点是否在另一个链表中存在。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值