【发布时间】:2013-07-22 07:40:51
【问题描述】:
给定一个列表,将其分成两个子列表——一个用于前半部分,一个用于后半部分。如果元素的数量是奇数,则额外的元素应该放在前面的列表中。所以FrontBackSplit() 列表上的{2, 3, 5, 7, 11} 应该产生两个列表{2, 3, 5} 和{7, 11}。
代码是这样的。
void FrontBackSplit(Node *head, Node **front, Node **back) {
if (!head) return; // Handle empty list
Node *front_last_node;
Node *slow = head;
Node *fast = head;
while (fast) {
front_last_node = slow;
slow = slow->next;
fast = (fast->next) ? fast->next->next : NULL;
}
front_last_node->next = NULL; // ends the front sublist
*front = head;
*back = slow;
}
问题是我没有得到最好的运行时间,有时也没有得到预期的输出。
【问题讨论】:
-
你准备好列表长度了吗?如果是,则除以 2,前进那么多节点并拆分。
-
有什么问题?调用函数时会发生什么?
-
如何确定“不是最佳运行时”以及输出有什么问题?
-
(!head)表示列表为空?检查条件。 -
@HenkHolterman... 如果元素的数量是偶数,那么它不会将它们平均分为两部分。
标签: c algorithm linked-list