递归-反转链表

题目描述:

/**
 * 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,后面的回归只起到了反转的作用
    }
}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值