常见面试算法题1:单链表逆置

单链表逆置可以说是最为常见的一道算法面试题了;思路就是遍历单链表的同时,将当前节点的next指向头结点,并更新头结点为当前节点。算法实现具体如下:


Node *Reverse(Node *head)

{

    if(head == NULL || head->next == NULL)

    {

        return head;

    }

    Node *p = head->next;

    p->next = head;

    head->next = NULL;

    head = p;

    while(p)

    {

        Node *q = p->next;

        p->next = head;

        head = p;

        p = q;

    }

    return head;

}

上述已经可以满足大多数公司对于该算法的考察了,然后博主有一次面试头条的时候,但是面试官让我写出该算法的递归解法,当时有点懵逼,不过还是硬着头皮写了一下,面试官看完就说你这还是循环的方式解得呀,不能算是递归,看来你根本不懂什么是递归呀,当时被怼的灰头土脸,想着这次面试挂定了(虽然最后还是过了,哈哈哈)。回来后,写出了单链表逆置的递归算法,递归的思想其实很简单,就是用子问题去解父,就是将一个问题转换为一个已解决的问题来实现问题。

下面给出单链表逆置的递归算法:


Node *Reverse(Node *head)

{

    if(head == NULL || head->next == NULL)

    {

        return head;

    }

    Node *p = Reverse(head->next);

    head->next->next = head;

    head->next = NULL;

    return p;

}

递归算法的实现虽然难以理解,但是代码却非常清晰和简洁。

你可能感兴趣的:(常见面试算法题1:单链表逆置)