[leetocde]206. 反转链表

题目 

 思路

我这里第一思路是递归,但没想到递归是最难理解的,我们先从易到难

一、正向遍历(迭代)

链表: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;
        }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值