不典型插入双向链表

时间:2017-12-10 00:53:30

标签: c++ doubly-linked-list

我得到了一个我不知道如何'咬'的任务。

  

编写一个方法,在双向链表中插入一对节点   使用double类型的键,在具有给定键的每个节点之前和之后

     

int insert(double where,double before,double after)

     

该函数返回插入的对数。

我该如何解读? 如何实现呢?

模板< ...

1 个答案:

答案 0 :(得分:0)

int insert (double where, double before, double after);

看起来很合理直截了当。对于匹配where的每个密钥,您必须在其前面插入before,在其后插入after

所以,假设你有:

||- 1 <-> 2 <-> 3 <-> 2 <-> 2 -||

然后是电话:

quant = insert (2, 3.14, 2.72);

最终会按如下方式修改列表:

||- 1 <-> 3.14 <-> 2 <-> 2.72 <-> 3 <-> 3.14 -+
                                              |
+---------------------------------------------+
|                              
+-> 2 <> 2.72 <> 3.14 <> 2 <> 2.72 -||

并返回值3

除了在节点之前和之后插入的行为之外,这与任何其他插入操作完全相同,并且事实上它是双重链接列表实际上使事情变得更容易。这种野兽的伪代码是:

# HEAD is pointer to first element, TAIL to last.

# Process entire list, doing the insertions as needed.

def insert(where, before, after):
    count = 0
    curr = HEAD
    while curr != null:
        if curr.data == where:
            count = count + 1
            insertBefore(curr, before)
            insertAfter(curr, after)
            curr = curr.next # see note (a) below.
        curr = curr.next
   return count

# Insert before a node, special processing needed for head.

def insertBefore(curr, value):
    node = new element
    node.data = value
    node.next = curr
    if curr == HEAD:
        HEAD = node
    else:
        curr.prev.next = node

def insertAfter(curr, value):
    node = new element
    node.data = value
    node.next = curr.next
    curr.next = node
    if curr == TAIL:
        TAIL = node

(a)可能想知道为什么我在插入发生的情况下将指针推进两次。如果您考虑whereafter具有相同值(例如7)时会发生什么,这种情况有望变得明显。

如果没有额外提升,您会在列表中找到7,然后在其后立即插入另一个7。然后你会发现那个 7并再次在它之后立即插入另一个7。这将持续相当长的一段时间。如果您愿意,请继续尝试,完成后再回来。

...

好的,希望很长时间没有 意识到没有某种干预就不会停止,例如 CTRL-C 或缺乏无限记忆: - )

进步确保您实际上不会将您添加的节点处理到列表中,只会处理流程启动时已存在的节点。