我会使用链表的级别。
message1
message2
message3
message4
message5
message6
message7
每个节点都有一个指向它的指针:
- forward sibling (2->5, 3->4, 5->6, 1/4/6/7->NULL).
- backward sibling (4->3, 5->2, 6->5, 1/2/3/7->NULL).
- first child (1->2, 2->3, 6->7, 3/4/5/7->NULL).
- parent (2->1, 3->2, 4->2, 5->1, 6->1, 7->6, 1->NULL).
在每个级别中,消息将按投票计数(或您想要使用的任何其他分数)在列表中排序。
这将为您移动事物提供最大的灵活性,并且您可以message2
仅通过更改父级和该级别的链接来移动整个子树(例如,)。
例如,saymessage6
获得大量选票,使其比message5
. 更改是(调整下一个和上一个兄弟指针):
message2 -> message6
message6 -> message5
message5 -> NULL
.
要得到:
message1
message2
message3
message4
message6
message7
message5
如果它一直持续到获得的票数超过message2
,则会发生以下情况:
message6 -> message2
message2 -> message5
AND的第一个子指针message1
设置为message6
(它是message2
),仍然相对容易获得:
message1
message6
message7
message2
message3
message4
message5
仅当分数更改导致消息变得大于其上兄弟或小于其下兄弟时才需要重新排序。您无需在每次更改分数后重新排序。