问题
今天的问题对于架构师来说会相对容易许多。今天出一个【数据结构与算法】相关的题目,醒醒脑。
给一张【单链表】,该单链表有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