Вот реализация C #, которая применяется для всех текущих правил. Он изменяет список во время выполнения, но список восстанавливается перед возвратом.
using System;
using System.Diagnostics;
namespace SO1135917.Classes
{
public class ReverseListPrinter
{
public static void Execute(Node firstNode, Action<Node> action)
{
Reverse(Reverse(firstNode, null), action);
}
private static Node Reverse(Node firstNode, Action<Node> action)
{
Node node = firstNode;
Debug.Assert(node != null);
Node nextNode = node.Next;
node.Next = null;
while (node != null)
{
if (action != null)
action(node);
if (nextNode == null)
break;
Node nextNode2 = nextNode.Next;
nextNode.Next = node;
node = nextNode;
nextNode = nextNode2;
}
return node;
}
}
}
Однако существует одна проблема, состоящая в том, что состояние списка не определено, если в указанных выше методах должно произойти исключение. Вероятно, не невозможно справиться, хотя.
Доступно хранилище приведенного выше кода Subversion с модульными тестами для Visual Studio 2008 здесь , имя пользователя и пароль - «гость» без кавычек.