background image

}

1.单链表反转

这道题目有两种算法,既然是要反转,那么肯定是要破坏原有的数据结构的:
算法 1:我们需要额外的两个变量来存储当前节点 curr 的下一个节点 next、再

下一个节点 nextnext:
public static Link ReverseLink1(Link head)
{
    Link curr = head.Next;
    Link next = null;
    Link nextnext = null;
    //if no elements or only one element exists
    if (curr == null || curr.Next == null)
    {
        return head;
    }
    //if more than one element
    while (curr.Next != null)
    {
        next = curr.Next;       //1
        nextnext = next.Next;   //2
        next.Next = head.Next;  //3
        head.Next = next;       //4
        curr.Next = nextnext;   //5
    }
    return head;
}

算法的核心是 while 循环中的 5 句话

我们发现,curr 始终指向第 1 个元素。

此外,出于编程的严谨性,还要考虑 2 种极特殊的情况:没有元素的单链表,

以及只有一个元素的单链表,都是不需要反转的。

算法 2:自然是递归

如果题目简化为逆序输出这个单链表,那么递归是很简单的,在递归函数之
后输出当前元素,这样能确保输出第 N 个元素语句永远在第 N+1 个递归函数

之后执行,也就是说第 N 个元素永远在第 N+1 个元素之后输出,最终我们先

输出最后一个元素,然后是倒数第 2 个、倒数第 3 个,直到输出第 1 个:
public static void ReverseLink2(Link head)
{
    if (head.Next != null)