예제 #1
0
        Task <ListNode> IListSerializer.DeepCopy(ListNode head)
        {
            var      node = head;
            ListNode tail = null;
            ListNode copy = null;

            while (node != null)
            {
                tail = node;
                var listNode = new ListNode {
                    Previous = copy, Data = node.Data.DeepCopy()
                };
                if (copy != null)
                {
                    copy.Next = listNode;
                }
                copy = listNode;
                node = node.Next;
            }

            ListNode result = null;

            while (tail != null)
            {
                result = copy;
                var randomId = tail.FindRandomNodeOffset();
                if (randomId != null)
                {
                    var random = copy;
                    if (randomId > 0)
                    {
                        do
                        {
                            random = random.Next;
                            randomId--;
                        } while (randomId != 0);
                    }
                    else if (randomId < 0)
                    {
                        do
                        {
                            random = random.Previous;
                            randomId++;
                        } while (randomId != 0);
                    }
                    copy.Random = random;
                }
                tail = tail.Previous;
                copy = copy.Previous;
            }

            return(Task.FromResult(result));
        }
예제 #2
0
        private static TestsHelper.NodeInfo[] CreateDeserializationInfo(ListNode node)
        {
            var list = new List <TestsHelper.NodeInfo>();

            while (node != null)
            {
                var nodeInfo = new TestsHelper.NodeInfo
                {
                    RandomId = node.FindRandomNodeOffset(),
                    Data     = node.Data.DeepCopy()
                };
                list.Add(nodeInfo);
                node = node.Next;
            }

            return(list.ToArray());
        }