算法通关村第二关——终于学会链表反转了

LeetCode206 给你单链表的头节点 head,请你反转链表,并返回反转后的链表。

示例1:

输入:head = [1,2,3,4,5]

输出:[5,4,3,2,1] 

1. 建立虚拟头结点辅助反转

思路:

新定义一个 ans 节点,让它作为链表的头部,每次循环遍历链表,ans 节点都与 原链表中最新 的节点连接,比如 :

初始化 ListNode ans = new ListNode(-1),值为 -1

head = 1  ->  2  ->  3  ->  4

循环次数:(注意观察值的变化)

第一次 : ans = -1 -> 1 ,head = 2 -> 3 -> 4

第二次: ans = -1 -> 1 -> 2 ,head = 3 -> 4

第三次: ans = -1 -> 1 -> 2 -> 3 ,head = 4

第四次: ans = -1 -> 2 -> 3 -> 4 ,head = null

记住在遍历的时候,一定要提前保存好 头节点,不然遍历到下一次的时候就丢了。

最后在返回的时候,要返回 ans.next,因为 ans作为头节点的值是 -1,后面才是反转后的值

代码:

public static ListNode reverselistNode(ListNode head) {
    ListNode ans = new ListNode(-1);
    ListNode cur = head;
    
    while(cur != null) {
        // 保存下一个节点,不然在遍历中会丢
        ListNode next = cur.next;
        
        cur.next = an.next;
        ans.next = cur;
        
        // 前面已经让 cur 发生变化了,现在让 cur 指向下一个节点
        cur = next;
    }
    
    return ans.next;
    
}

2. 直接操作链表实现反转

这次就与上次不同了,但是思想是差不多的,上次是借助虚拟节点 ans 实现的反转,可能会在面试时会被禁止使用,原因是不借助虚拟节点更难。

这里是直接操作原来的链表,返回的链表引用地址的一样的

 代码:

public static ListNode reverseListNode(ListNode head) {
    ListNode prev = null;
    ListNode cur = head;
    
    while(cur != null) {
        // 保存下一个节点
        ListNode next = cur.next;
        
        cur.next = prev;
        prev = cur;
        
        cur = next;
    }
    return prev;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值