题目
思路
我这里第一思路是递归,但没想到递归是最难理解的,我们先从易到难
一、正向遍历(迭代)
链表:1->2->3->空
结果:空<-1<-2<-3
正向遍历的话我们需要先让1->空,也就是让1的next为null,但这样我们会丢失2,因为1.next=null了。所以要先用ListNode存储head.next,然后再head.next=pre,最后更新pre和cur
public ListNode reverseList1(ListNode head) {
ListNode pre = null;
ListNode cur = head;
while (cur != null) {
//1,2,3,4,5
//这里先要把1指向null,即cur.next=pre 但这样会丢掉cur.next,所以我们先存下来
ListNode next = cur.next;
//然后再把当前的指向上一个
cur.next = pre;
//更新pre和cur
pre = cur;
cur = next;
}
return pre;
}
二、反向遍历(递归)
链表:1->2->3->空
结果:空<-1<-2<-3
我们先通过递归进入到最后,我们要保存最后一个非空元素,返回到最上面。
递归停止条件:head==null是防止链表为空,head.next==null是返回最后一个非空节点。
返回3后,我们当前的函数head是2,我们要让3->2,那么就要2.next.next=head,这时
2和3互指,我们再拿掉2->3,即2.next=null,最后返回3,这个3一直返回到最初
public ListNode reverseList(ListNode head) {
//递归停止的条件,head==null是判断数组是不是空,head.next为null才是主要的递归停止条件
if (head == null || head.next == null) {
//要把尾节点一直送到最开始
return head;
}
//递归体
ListNode listNode = reverseList(head.next);
//递归到最后一个也是第一个返回的地方,此时head为倒数第二个非空节点4
//head.next=5, 5.next=4
//1->2->3->4->5
head.next.next = head;
//1->2->3->4<->5
//4.next = null
head.next = null;
//1->2->3->4<-5
return listNode;
}