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)); }
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()); }