public void LinkedListIntv_CopyRandomListTest1()
        {
            RandomListNode l0 = new RandomListNode(0),
           l1 = new RandomListNode(1),
           l2 = new RandomListNode(2),
           l3 = new RandomListNode(3),
           l4 = new RandomListNode(4);

            l0.Next   = l1;
            l1.Next   = l2;
            l2.Next   = l3;
            l3.Next   = l4;
            l0.Random = l2;
            l3.Random = l0;

            RandomListNode r = CopyRandomList(l0);

            Assert.AreEqual(0, r.Label);
            Assert.AreEqual(2, r.Random.Label); r = r.Next;
            Assert.AreEqual(1, r.Label); r        = r.Next;
            Assert.AreEqual(2, r.Label); r        = r.Next;
            Assert.AreEqual(3, r.Label);
            Assert.AreEqual(0, r.Random.Label); r = r.Next;
            Assert.AreEqual(4, r.Label);
        }
        public static RandomListNode CopyRandomList(RandomListNode head)
        {
            if (null == head)
            {
                return(null);
            }

            RandomListNode result   = null,
                           pold     = head,
                           pnew     = result,
                           poldNext = null;

            do
            {
                poldNext  = pold.Next;
                pnew      = new RandomListNode(pold.Label);
                pold.Next = pnew;
                pnew.Next = poldNext;
                if (result == null)
                {
                    result = pnew;
                }
                pold = poldNext;
            }while(pold != null);

            pold = head;
            while (pold != null)
            {
                if (pold.Random != null)
                {
                    pold.Next.Random = pold.Random.Next;
                }
                pold = pold.Next.Next;
            }

            pold = head;
            pnew = result;
            while (pnew.Next != null)
            {
                pold.Next = pnew.Next;
                pold      = pold.Next;
                pnew.Next = pold.Next;
                pnew      = pnew.Next;
            }

            pold.Next = null;
            pnew.Next = null;
            return(result);
        }