📌  相关文章
📜  用于交替拆分给定单链表的Java程序 - 集 1

📅  最后修改于: 2022-05-13 01:54:31.794000             🧑  作者: Mango

用于交替拆分给定单链表的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 了解更多详情!