1.思路图解
一个单链表长这样:
反转之后长这样:
现在来分析,怎么样才能实现下面的反转。
对比上面的两张图,好像首先可以考虑把指向2的指针反转一下,如下图。
但是这样会产生一个问题,就是没有指向2的指针了。这样JVM的GC就会自动将2及以后的节点回收了。所以很自然,我们想到,在反转之前,用一个指针指向2节点,这样2就不会丢失了。
这样反转就没问题了!
由于最终head要在3的位置,所以head指针也要往前走,那么问题来了!这时没有指针是指向1的,所以很自然,我们想到用一个指针指向1。
三条指针移动的顺序是这样:黑色移向下一个结点,然后完成反转;蓝色移过来,因为橙色的下移,就会使一个节点指空;最后是橙色结点移过去。
这个蓝色的指针有两个用处:①保证有指针指向1②2的指针指向蓝色指针所指的内容,就完成了反转。
2.代码实现
2.1如何创建一个单链表
2.1.1结点类
2.1.2方法类
2.1.3创建单链表
2.2反转单链表的方法
public Node reverselinkedlist(Node head){
Node pre = null;
Node fol = null;
while(head != null){
fol = head.next;
head.next = pre;
pre = head;
head = fol;
}
return pre;
}