用于交替拆分给定单链表的Java程序 - 集 1
编写一个函数AlternatingSplit(),它接受一个列表并将其节点划分为两个较小的列表“a”和“b”。子列表应由原始列表中的交替元素组成。因此,如果原始列表是 0->1->0->1->0->1,那么一个子列表应该是 0->0->0,另一个应该是 1->1->1。
方法(使用虚拟节点):
这是一种以与源列表相同的顺序构建子列表的方法。该代码在构建“a”和“b”列表时使用临时虚拟标头节点。每个子列表都有一个指向其当前最后一个节点的“尾”指针——这样新节点可以很容易地附加到每个列表的末尾。虚拟节点给尾指针一些最初指向的东西。在这种情况下,虚拟节点是有效的,因为它们是临时的并且在堆栈中分配。或者,可以使用本地“引用指针”(始终指向列表中的最后一个指针而不是最后一个节点)来避免虚拟节点。
Java
// Java program to implement
// the above approach
static void AlternatingSplit(Node source,
Node aRef,
Node bRef)
{
Node aDummy = new Node();
// Points to the last node in 'a'
Node aTail = aDummy;
Node bDummy = new Node();
// Points to the last node in 'b'
Node bTail = bDummy;
Node current = source;
aDummy.next = null;
bDummy.next = null;
while (current != null)
{
// Add at 'a' tail
MoveNode((aTail.next),
current);
// Advance the 'a' tail
aTail = aTail.next;
if (current != null)
{
MoveNode((bTail.next),
current);
bTail = bTail.next;
}
}
aRef = aDummy.next;
bRef = bDummy.next;
}
// This code is contributed by rutvik_56
时间复杂度: O(n),其中 n 是给定链表中的节点数。
资料来源:http://cslibrary.stanford.edu/105/LinkedListProblems.pdf
请参阅有关给定单链表的交替拆分的完整文章 |设置 1 了解更多详情!