/// <summary> /// Perform a deep copy of a path consisting of linked nodes /// </summary> /// <param name="curFirstNode">First node of the current path</param> /// <returns>First node of the copied path</returns> static TrainpathNode DeepCopyOfLinkedNodes(TrainpathNode curFirstNode) { if (curFirstNode == null) { return(null); } TrainpathNode newFirstNode = curFirstNode.ShallowCopyNoLinks(); TrainpathNode curMainNode = curFirstNode; TrainpathNode newMainNode = newFirstNode; TrainpathNode curSidingNode = null; TrainpathNode newSidingNode = null; TrainpathNode newNextMainNode; while (curMainNode.NextMainNode != null) { // in case there is a passing path, follow that first. // At the end of the path, curSidingNode will be the main Node to link again to if (curMainNode.NextSidingNode != null) { curSidingNode = curMainNode; newSidingNode = newMainNode; while (curSidingNode.NextSidingNode != null) { newSidingNode.NextSidingNode = curSidingNode.NextSidingNode.ShallowCopyNoLinks(); newSidingNode.NextSidingNode.PrevNode = newSidingNode; curSidingNode = curSidingNode.NextSidingNode; newSidingNode = newSidingNode.NextSidingNode; } } if (curSidingNode == curMainNode.NextMainNode) { // We need to relink to the end of a siding path. The corresponding node has already been created newNextMainNode = newSidingNode; curSidingNode = null; // no linking needed anymore } else { newNextMainNode = curMainNode.NextMainNode.ShallowCopyNoLinks(); } newNextMainNode.PrevNode = newMainNode; newMainNode.NextMainNode = newNextMainNode; curMainNode = curMainNode.NextMainNode; newMainNode = newMainNode.NextMainNode; } return(newFirstNode); }