我得到了一个我不知道如何'咬'的任务。
编写一个方法,在双向链表中插入一对节点 使用double类型的键,在具有给定键的每个节点之前和之后
int insert(double where,double before,double after)
该函数返回插入的对数。
我该如何解读? 如何实现呢?
模板< ...
答案 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)你可能想知道为什么我在插入发生的情况下将指针推进两次。如果您考虑where
和after
具有相同值(例如7
)时会发生什么,这种情况有望变得明显。
如果没有额外提升,您会在列表中找到7
,然后在其后立即插入另一个7
。然后你会发现那个 7
并再次在它之后立即插入另一个7
。这将持续相当长的一段时间。如果您愿意,请继续尝试,完成后再回来。
...
好的,希望很长时间没有 意识到没有某种干预就不会停止,例如 CTRL-C 或缺乏无限记忆: - )
进步确保您实际上不会将您添加的节点处理到列表中,只会处理流程启动时已存在的节点。