标签:eve 优雅 des code img 输入 方便 链表 reverse
要求很简单,输入一个链表,反转链表后,输出新链表的表头。
??反转链表是有2种方法(递归法,遍历法)实现的,面试官最爱考察的算法无非是斐波那契数列和单链表反转,递归方法实现链表反转比较优雅,但是对于不了解递归的同学来说还是有理解难度的。
总体来说,递归法是从最后一个Node开始,在弹栈的过程中将指针顺序置换的。
为了方便理解,我们以 1->2->3->4这个链表来做演示。输出的效果是4->3->2->1
首先定义Node:
public static class Node {
public int value;
public Node next;
public Node(int data) {
this.value = data;
}
}
反转方法如下:
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;
}
递归实质上就是系统帮你压栈的过程,系统在压栈的时候会保留现场。
我们来看是怎样的一个递归过程:1->2->3->4
返回新链表的头结点newHead
注意:当retuen后,系统会恢复2结点压栈时的现场,此时的head=2结点;temp=2结点.next(3结点),再进行上述的操作。最后完成整个链表的翻转。
遍历法就是在链表遍历的过程中将指针顺序置换
先上代码:
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;
}
进行循环...
标签:eve 优雅 des code img 输入 方便 链表 reverse
原文地址:https://www.cnblogs.com/keeya/p/9218352.html