leetcode真题解析-链表反转
链表反转
问题:将单链表的连接顺序翻转过来
例如:输入:1 -> 2 -> 3 -> 4 -> 5
输出:5 -> 4 -> 3 -> 2 -> 1
1.采用迭代的方法
迭代法原理图
package Package01;
public class ReverseList {
static class ListNode{
int val;
ListNode next;
public ListNode(int val, ListNode next){
this.val = val;
this.next = next;
}
}
public static ListNode iterate(ListNode head){ //这里是一个方法,返回值是一个节点。
ListNode prev=null ,next;
ListNode curr = head;
while(curr != null) {
next = curr.next;
curr.next = prev;
prev = curr;
curr = next;
}
return prev; //这里的返回的相当于是新的反转后的节点的头节点
}
public static void main(String[] args) {
ListNode node5 = new ListNode(5,null);
ListNode node4 = new ListNode(4,node5);
ListNode node3 = new ListNode(3,node4);
ListNode node2 = new ListNode(2,node3);
ListNode node1 = new ListNode(1,node2);
ListNode prev = iterate(node1);
System.out.println(prev);
}
}
后续思考:
前面可以看到,我i们采用了3个临时变量,是否可以通过减少临时变量呢,下面请看我的一个分析。
首先,我们可以看一下是否可以减少为一个临时变量:
然后,我们可以看一下是否可以减少为2个临时变量:
2. 采用递归的方法
递归法原理图
//递归代码
public static ListNode recursion(ListNode head){
if(head==null || head.next==null){
return head;
}
ListNode new_head = recursion(head.next);
head.next.next = head;
head.next = null;
return new_head;
}