返回

迂回取胜,答题大师教你秒解 11 年“陈年老题”

后端

真是没想到,一道面试题居然从 11 年前就开始讨论了,而官方今年才表态。今天我们就来一起盘点一下这道面试题。

题目:

给定一个链表,每个节点包含一个整数。请编写一个函数,将链表中的所有偶数节点提取出来,形成一个新的链表。

要求:

  • 时间复杂度:O(n)
  • 空间复杂度:O(1)

解答:

这道题目的关键在于如何巧妙地遍历链表并同时提取偶数节点。我们可以利用两个指针,一个指向当前节点,另一个指向新链表的尾节点。

  1. 初始化两个指针:curr 指向链表头节点,tail 指向新链表的尾节点(最初为 nullptr)。
  2. 遍历链表,如果 curr 指向的节点值是偶数,则将 curr 指向的节点添加到新链表的尾部,并更新 tail 指向。
  3. curr 指向下一个节点,重复步骤 2 和 3,直到 curr 指向 nullptr

代码示例:

def extract_even_nodes(head):
    """
    提取链表中的所有偶数节点。

    参数:
    head: 链表头节点

    返回:
    偶数节点组成的链表
    """

    # 初始化指针
    curr = head
    tail = None

    while curr:
        # 如果当前节点值是偶数
        if curr.val % 2 == 0:
            # 将当前节点添加到新链表的尾部
            if tail:
                tail.next = curr
            else:
                # 如果新链表为空,则将当前节点设为头节点
                head = curr

            # 更新新链表的尾节点
            tail = curr

        # 移动到下一个节点
        curr = curr.next

    return head

面试技巧:

  • 理解题目要求: 仔细阅读题目,确保理解所要解决的问题。
  • 分步思考: 将问题分解为更小的步骤,逐步解决。
  • 善用数据结构: 选择合适的辅助数据结构,如指针和链表,以有效地管理数据。
  • 注重时间和空间复杂度: 考虑算法的时间和空间复杂度是否满足要求。
  • 简洁明了: 使用清晰简洁的代码,易于理解和调试。

通过巧妙的解题思路和有效的面试技巧,我们可以轻松应对这道 11 年“陈年老题”。无论是在面试中还是在实际工作中,保持清晰的思维和灵活的解决问题能力都是至关重要的。