{
ReverseLink2(head.Next);
Console.WriteLine(head.Next.Data);
}
}
但是,现实应用中往往不是要求我们逆序输出(不损坏原有的单链表),而
是把这个单链表逆序(破坏型)。这就要求我们在递归的时候,还要处理递
归后的逻辑。
首先,要把判断单链表有 0 或 1 个元素这部分逻辑独立出来,而不需要在递归
中每次都比较一次:
public static Link ReverseLink3(Link head)
{
//if no elements or only one element exists
if (head.Next == null || head.Next.Next == null)
return head;
head.Next = ReverseLink(head.Next);
return head;
}
我们观测到:
head.Next = ReverseLink(head.Next);
这句话的意思是为 ReverseLink 方法生成的逆序链表添加一个空表头。
接下来就是递归的核心算法 ReverseLink 了:
static Link ReverseLink(Link head)
{
if (head.Next == null)
return head;
Link rHead = ReverseLink(head.Next);
head.Next.Next = head;
head.Next = null;
return rHead;
}
算法的关键就在于递归后的两条语句:
head.Next.Next = head; //1
head.Next = null; //2
啥意思呢?画个图表示就是:
这样,就得到了一个逆序的单链表,我们只用到了 1 个额外的变量 rHead。