internal void Merge(SparseLinkedList <T> list)
        {
            Lock();
            list.Lock();

            Version++;
            list.Version++;

            MergeImpl(list);

            VerifyStructure();
            list.VerifyStructure();

            Unlock();
            list.Unlock();
        }
        internal void Swap(int index, SparseLinkedList <T> list)
        {
            Lock();
            list.Lock();

            VerifyIndex(index);

            Version++;
            list.Version++;

            SwapImpl(list);

            VerifyStructure();
            list.VerifyStructure();

            Unlock();
            list.Unlock();
        }
        internal void SplitAt(int index, SparseLinkedList <T> targetList)
        {
            Lock();
            targetList.Lock();

            VerifyIndex(index, true);

            Version++;
            targetList.Version++;

            SplitAtImpl(index, targetList);

            VerifyStructure();
            targetList.VerifyStructure();

            Unlock();
            targetList.Unlock();
        }