单链表逆置可以说是最为常见的一道算法面试题了;思路就是遍历单链表的同时,将当前节点的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;
}
递归算法的实现虽然难以理解,但是代码却非常清晰和简洁。