我一直在练习不同的面试问题,而且我遇到了一个问题,当我手动执行代码时,我似乎无法解决这个问题。
问题是编写一个函数,该函数将值x
周围的链表分区,使得小于x
的所有节点都在所有节点大于或等于x
之前。
[3,5,8,5,10,2,1]其中x = 5
应该输出如下内容:[1,2,3,5,8,5,10](输出可能因实现而异)。
以下是解决方案:
LinkedListNode* partition(LinkedListNode* node, int x)
{
LinkedListNode* head = node;
LinkedListNode* tail = node;
while (node)
{
LinkedListNode* next = node->next;
if (node->data < x)
{
node->next = head;
head = node;
} else {
tail->next = node;
tail = node;
}
node = next;
}
tail->next = nullptr;
return head;
}
我知道解决方案有效,当在上面的链表上运行时,我得到以下输出:[1,2,3,5,8,5,10]
当我手动操作时,我感到困惑。首次遍历链接列表时,node
,head
,tail
都指向值为3的节点。现在我们在if
中言。
我们将node->next
设置为head
,现在指向自身(具有node-&gt; data = 3的那个)!在遍历整个列表之后,该节点的下一个字段总是指向它自己。
显然,这个功能正在按预期工作,但我必须踩错它。任何洞察我忽略的东西??
谢谢!
编辑:澄清