Skip to content

中级面试题

队列和栈的区别

面试题目

请说明队列和栈的区别

公司

  • 字节跳动

招聘类型

  • 社招
  • 校招

答案

队列(Queue)和栈(Stack)是两种常见的数据结构,它们在数据存储和访问方面有着不同的特点。以下是它们之间的主要区别:

  1. 数据结构特性
  2. 队列是一种先进先出(First In, First Out,FIFO)的数据结构,类似于排队,即最先进入队列的元素最先被移出。
  3. 是一种后进先出(Last In, First Out,LIFO)的数据结构,类似于堆叠,即最后压入栈的元素最先被弹出。

  4. 操作

  5. 队列支持两种主要操作:入队(enqueue)和出队(dequeue)。元素从队列尾部入队,从队列头部出队。
  6. 支持两种主要操作:压栈(push)和弹栈(pop)。元素从栈顶压入栈中,从栈顶弹出栈。

  7. 应用场景

  8. 队列常用于需要按照先后顺序处理数据的场景,如任务调度、消息队列等。
  9. 常用于需要后进先出顺序访问数据的场景,如表达式求值、函数调用栈等。

  10. 内存管理

  11. 队列都可以通过数组或链表来实现。在使用数组实现时,队列的头部和尾部分别用于出队和入队操作;而栈只需操作数组的尾部即可。
  12. 在使用链表实现时,队列和栈的实现方式会有所不同。队列通常使用单向链表,头部用于出队,尾部用于入队;而栈通常使用单向链表或双向链表,头部用于压栈和弹栈操作。

总的来说,队列和栈是两种常用的数据结构,它们分别适用于不同的场景和需求,对于数据的存储和访问提供了不同的解决方案。

链表反转

面试题目

请编写一下链表反转算法。

公司

  • 阿里巴巴

招聘类型

  • 社招
  • 校招

答案

迭代解法

def reverseList(self, head: ListNode) -> ListNode:
    prev, curr = None, head
    while curr is not None:
        next = curr.next
        curr.next = prev
        prev = curr
        curr = next
    return prev

递归解法

def reverseList(self, head: ListNode) -> ListNode:
    # 1. 递归终止条件
    if head is None or head.next is None:
        return head

    p = self.reverseList(head.next)
    head.next.next = head
    head.next = None

    return p