要求很简单,输入一个链表,反转链表后,输出新链表的表头。
反转链表是有2种方法(递归法,遍历法)实现的,面试官最爱考察的算法无非是斐波那契数列和单链表反转,递归方法实现链表反转比较优雅,可是对于不了解递归的同窗来讲仍是有理解难度的。node
整体来讲,递归法是从最后一个Node开始,在弹栈的过程当中将指针顺序置换的。面试
为了方便理解,咱们以 1->2->3->4这个链表来作演示。输出的效果是4->3->2->1算法
首先定义Node:bash
public static class Node {
public int value;
public Node next;
public Node(int data) {
this.value = data;
}
}复制代码
反转方法以下:ui
public Node reverse(Node head) {
if (head == null || head.next == null)
return head;
Node temp = head.next;
Node newHead = reverse(head.next);
temp.next = head;
head.next = null;
return newHead;
}复制代码
递归实质上就是系统帮你压栈的过程,系统在压栈的时候会保留现场。this
咱们来看是怎样的一个递归过程:1->2->3->4spa
返回新链表的头结点newHead指针
注意:当retuen后,系统会恢复2结点压栈时的现场,此时的head=2结点;temp=2结点.next(3结点),再进行上述的操做。最后完成整个链表的翻转。code
public static Node reverseList(Node node) {
Node pre = null;
Node next = null;
while (node != null) {
next = node.next;
node.next = pre;
pre = node;
node = next;
}
return pre;
}复制代码
依旧是1->2->3->4做 者:上帝爱吃苹果
出 处:www.cnblogs.com/keeya
关于博主:决定咱们心情的不止是如今这个时候咱们所拥有的,更是咱们对将来的预期。
版权声明:署名 - 非商业性使用 - 禁止演绎,协议普通文本 | 协议法律文本。
声援博主:若是您以为文章对您有帮助,能够点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!