看下下面这道题
将这个链表反转过来,这种题一般有两种方法来解决
一.迭代:重复某一过程,每一次处理的结果作为下一次处理的初始值,直至达到最终状态
二.递归:将一个大问题拆分为小问题,在运行过程中调用自身
逻辑比较绕,先看下下面这两张图,1为迭代,2为递归;
按照图示开始编码,如下,代码有注释,需要仔细看啊 , 这块确实有点绕的
/**
*
* @author : Mr.Leslie
* @version 1.0
* @description: TODO
* @date 2022/7/16 16:21
*/
public class LinkedListReverse {
//内部类-节点对象
static class Node{
//值
int value;
//下一节点
Node next;
public Node(int value, Node next) {
this.value = value;
this.next = next;
}
@Override
public String toString() {
return "Node{" +
"value=" + value +
", next=" + next +
'}';
}
}
//迭代方法-从第一个元素开始遍历
public static Node iterate(Node head){
//第一个元素的前置节点为null
Node prev=null;
//下一节点
Node next;
//当前遍历位置curr 初始值就是head
Node curr=head;
//为什么用while?因为不知道链表的长度,什么时候跳出循环?看上图 无论反转前后,当遍历到最后一个元素时,next已经是 null的时候就可以结束循环
while (curr!=null){
//首先保存当前节点的next指针
next=curr.next;
//将prev赋值给next
curr.next=prev;
//将curr赋值给指针指向的下一对象的prev
prev=curr;
//将指向下一节点的next赋值给curr
curr=next;
}
//返回prev就是反转后的链表
return prev;
}
//递归
public static Node recursion(Node head){
//当节点本身为null 或者指针指向的结果为null时,代表最后一个节点
if(head==null||head.next==null){
return head;
}
//递归找到最后一个节点
Node newHead = recursion(head.next);
//第一次5的next指向 4,第二次 4 next指向 3
head.next.next=head;
//4的next 为null,3的next置为null
head.next=null;
//将值返回到63行
return newHead;
}
public static void main(String[] args) {
Node node5=new Node(5,null);
Node node4=new Node(4,node5);
Node node3=new Node(3,node4);
Node node2=new Node(2,node3);
Node node1=new Node(1,node2);
System.out.println("反转前:"+node1);
Node prev = recursion(node1);
System.out.println("反转后:"+prev);
}
}
迭代打印结果
递归打印结果
可以拷贝代码自己跑一下,感谢收看