架构师面试(二十七):单链表

问题

今天的问题对于架构师来说会相对容易许多。今天出一个【数据结构与算法】相关的题目,醒醒脑。

给一张【单链表】,该单链表有100个节点元素(当然,事先我们是不知道100这个数目的),要获取倒数第8个元素的值,时间复杂度最小应该是多少呢?

    A、108;

    B、100;

    C、92;

    D、8。

(提示一下:这是数据结构中一个非常典型的小型算法,有栈实现方案、队列实现方案和双指针实现方案等!)

解析

图片

获取单链表倒数第 x 个元素(如上图所示,假设 x = 3),有这样几种常用方案:

方案一:栈实现方案

        

图片

        顺序遍历单链表,将所有的节点元素顺序“入栈”;然后再执行“出栈”操作,第 x 次“出栈”的元素就是单链表中倒数的第  x 个元素;该方案的时间复杂度 为 单链表长度  len + x。

方案二:队列实现方案

图片

       准备一个长度为 x 的队列;顺序遍历单链表,将所有的节点元素顺序“入队”(入队过程中,如果队列已满,则“出队”一个元素后,再“入队”,周而复始,让队列始终保持队满状态);当单链表最后一个元素“入队”后,此时队首元素即是单链表中倒数的第 x 个元素(当然,此时的队列需要是满的状态); 该方案的时间复杂度为 单链表的长度 len。

方案三:双指针实现方案

图片

     准备两个指针 p 和 q,让 p 指向单链表的首元素,让 q 指向单链表的第 x 个元素; 然后两个指针一起向后移动, 当 q 指向单链表最后一个元素时,指针 p 指向的元素即是单链表倒数的第 x 个元素; 该方案的时间复杂度为 单链表的长度 len。

数据结构中任何一个问题,几乎都可以至少找到两种解决方案,是不是很奇妙?!

参考答案

B

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值