如果从第一个节点开始的话 他的head的next是2节点 2节点的next是三节点
这样 我们把2节点的next指向头节点 这样不是不就是控制了反转了吗?
还有一个问题需要考虑 虽然 head.next.next =head 是头节点
但是head.next的值还是第二个节点 所以 把 head.next=null 这样就不会 死循环了
这就是本题的核心解法
但是 这这样就找不到 第三个节点了呀
所以 我们从最后一个节点开始找
怎样获取最后一个节点了 递归的思想 如果递归的思想 不熟悉的话 简单来说 就是自己掉自己 直到最后一个
好吧 来代码
package suanfa.link;
import org.w3c.dom.Node;
public class LinkDiGui {
static class ListNode {
private int value;
private ListNode next;
public ListNode(int value, ListNode next) {
this.value = value;
this.next = next;
}
}
//递归
public static ListNode diGui(ListNode head) {
//首先判断头节点是否为空
if (head == null || head.next == null) {
return head; //如果头节点为空 并且当前节点的下一个节点为空返回
}
ListNode new_Node = diGui(head.next);//递归调用直接找到链表的尾部
head.next.next = head;//现在是尾节点 直接从为节点往前找
head.next = null;//设置下一个节点为空 不能往前找 要不然 无限循环了
return new_Node;
}
//整个链表的结构
public static void main(String[] args) {
ListNode node3 = new ListNode(3,null);
ListNode node2 = new ListNode(2,node3);
ListNode node1 = new ListNode(1,node2);
//测试
ListNode prev = diGui(node1);
System.out.println(prev);
}
}
测试:debug
不熟悉debug的同学 也要去学一学 这个 可以很好的弄清楚 递归的先后顺序
对您用的话 记得关注哦 每天都会有不同类型的算法