题目描述:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
// 递归,自己调用自己
class Solution {
// 设置了一个头节点
public ListNode reverseList(ListNode head) {
// 如果头节点是空的或者头节点的下一个节点是空的。则说明此链表为空链表或者此链表只有一个数。可以想到直接返回这个节点就是该链表的反转链表。否则,跳到下一句代码执行。
if(head == null || head.next == null)
return head;
//这种等式从右往左看 ,因为是把右边的值赋给左边
// 这个语句调用了自己reverseList
// 比如上面head原来是1,那head.next就是2。再调用于是head就变成了2.于是从前往后遍历整个链表
// 直到遍历至5,return head返回5本身。于是遍历的结果5就赋值给newhead
ListNode newHead = reverseList(head.next);
// 为了反转链表返回5,4,3,2,1,指针必须从5往回指。
// 所以5的下一个指针要指向4,并把4指向5的指针消掉
// 由前面的逻辑可以知道head.next是5,head是4。于是head.next.next意思就是5的下一个指针,这个指针指向4,由此实现反转;
head.next.next = head ;
// head是4,所以head.next是4指向5的那个指针,等于null,即去除掉4指向5的指针。真正开始反转:5-》4-》3-》2-》1
head.next = null ;
// newHead返回5。开启反向遍历输出反向链表
return newHead;
// 注意newHead返回一直是5,后面的回归只起到了反转的作用
}
}