background image

    {
        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。