【问题标题】:"Guessing" what side of a doubly linked list to start on“猜测”从双向链表的哪一侧开始
【发布时间】:2016-01-13 02:16:23
【问题描述】:

有点难以解释我的计划,但就是这样。我有一个对象的双向链接列表,这些对象按名为name 的成员属性按字母顺序排列。我希望删除一个具有特定名称的节点,但我想以这样一种方式删除它,以便它更有可能开始在靠近它的列表一侧寻找它。

所以我想我必须找到第一个节点的name 和最后一个节点的name 之间的“中点”。然后我将检查该中点是否小于节点的名称。少的话就从尾部开始,否则就从头部开始。

我遇到的问题是我无法将字符串直接转换为 int。我可能的解决方案是:

  1. 将头部和尾部中的每个单独字符转换为 int
  2. 把每一个转换成一个int数组,一个数组为头部,一个数组为尾部
  3. 再次将每个 int 转换为字符串并将它们放入新数组中
  4. 如果每个转换字符串的长度小于 3,则通过在其中插入 0 来使每个转换字符串的长度为 3
  5. 将每个数组中的字符串相加
  6. 再次将字符串转换为 int 并找到两个 int 之间的差异并将其除以 2
  7. 将新值添加到第一个节点的转换名称
  8. 查找此“中点”是否小于我要删除的节点的名称
  9. 如果是,从尾部开始搜索
  10. 否则,从头部搜索

有没有更简单的方法来做到这一点?

【问题讨论】:

  • 您只能比较第一个不同的字符。
  • 从哪一端开始并不重要。这不就是双链表的全部目的吗?
  • 如果有更少的节点我必须通过尾部与头部进行迭代,反之亦然。
  • @Sythe 无论如何,您需要检查列表项才能知道这一点。不是吗?
  • 如果搜索时间对您很重要,那么链表是错误的结构。而是查看树或哈希表。

标签: c++ doubly-linked-list


【解决方案1】:

Alf 的评论实际上是您想要的。为了决定在哪一端,您只需找到第一个不同的字符,然后根据中点进行选择,即可获得最大分辨率。

算法思路

list = ["apple", "banana", "orange"]
word_to_search_for = ["banana"]

index = 0
while list[0][index] == list[last][index]:
    if word_to_search_for[index] != list[0][index]:
        return "word not in list"
    ++index

spread = list[last][index] - list[0][index]
if (word_to_search_for[index] - list[0][index])> spread/2:
    start at last
else:
    start at 0

【讨论】:

  • 不应该是 if (word_to_search_for[index] - list[0][index]) > spread/2?
  • 是的,我想现在看。不错的收获
【解决方案2】:

您可以创建一个指向列表中某些节点子集的指针数组,例如指向列表的第一个、中间和最后一个节点的指针。您可以使用更多指针来减少搜索时间,可能是 4 到 16 个指针。一种层次化的整体结构。当节点被删除时,数组需要更新(至少是指向已删除节点的指针,如果发生这种情况,在之前或之后选择节点,或者缩小数组)。在某些时候,树状结构会更好。

【讨论】:

    【解决方案3】:

    正如其他人已经提到的那样,您的主要问题是您使用了错误的数据结构。您的问题不应该是“如何使双链表以明显不同于双链表的方式运行?”,而应该是“{插入您的特定用例}的最佳数据结构是什么?” .

    从字里行间看,您似乎正在寻找允许插入、删除和相对高速扫描的东西。这导致我建议一棵左倾红黑树:见https://en.wikipedia.org/wiki/Left-leaning_red%E2%80%93black_tree

    【讨论】:

      猜你喜欢
      • 2011-12-15
      • 2020-01-22
      • 1970-01-01
      • 2017-12-06
      • 1970-01-01
      • 1970-01-01
      • 2011-04-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多