【问题标题】:Reverse a linked list as big as having 7 million nodes efficiently using Threads使用线程有效地反转具有 700 万个节点的链表
【发布时间】:2013-08-12 10:54:58
【问题描述】:

有人问我这个问题是为了通过有效地使用线程来反转一个拥有 700 万个节点的单链表。如果有这么多节点,使用递归看起来不可行,所以我选择了分而治之,在每个线程中给定一个链表块,只需通过存储引用使节点指针指向前一个节点,就可以反转当前,未来和过去的节点,然后将其与其他线程的反向块一起添加。但是面试官坚持认为链表的大小是不知道的,不用找到大小就可以做到。嗯,我想不通,你会怎么做?

【问题讨论】:

    标签: multithreading singly-linked-list divide-and-conquer


    【解决方案1】:

    这类问题我喜欢实现“自上而下”:

    1. 假设您已经有一个实现 Runnable 或扩展 Thread 的类,您可以从中创建实例并运行,每个实例接收两个参数:指向列表中节点的指针和要反转的节点数
    2. 您的main 遍历所有 700 万个节点并“标记”线程的起点,假设我们有 7 个线程,标记点将是:1、1,000,000、2,000,000,... 将标记的节点保存在数组或您喜欢的任何数据结构
    3. 完成“标记起点后,创建线程并为每个线程指定起点和计数器 1,000,000
    4. 所有线程完成后,“粘合”每个标记点以指向前一个线程的最后一个节点(应保存在另一个“静态”有序数据结构中)。

    现在我们有了一个计划——剩下要做的就是实现一个(相当简单的)算法,给定数字 N 和一个节点 x,它将反转单链表中的下 N 个节点(包括 x) :)

    【讨论】:

      猜你喜欢
      • 2011-10-31
      • 1970-01-01
      • 2015-06-15
      • 2013-08-11
      • 1970-01-01
      • 2020-04-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多