【每日一题】JZ15 反转链表

当你的才华还撑不起你的野心时,你应该静下心去学习 。

题目描述

非常经典的一道手撕代码题(不过目前K个一组翻转会更多,但都是要掌握的),输入一个链表,反转链表后,输出新链表的表头。

在这里插入图片描述

输入:{1,2,3}
输出:{3,2,1}

解题思路

迭代:

假设存在链表 1→2→3→∅,我们想要把它改成 ∅←1←2←3。

在遍历列表时,将当前节点的 next 指针改为指向前一个元素。由于节点没有引用其上一个节点,因此必须事先存储其前一个元素。在更改引用之前,还需要另一个指针来存储下一个节点。

递归:
递归版本稍微复杂一些,其关键在于反向工作。假设列表的其余部分已经被反转,现在我们应该如何反转它前面的部分?

假设列表为:

在这里插入图片描述
若从节点 nk+1 到 nm 已经被反转,而我们正处于 nk
在这里插入图片描述

​我们希望 nk+1 的下一个节点指向 nk。所以,nk.next.next = nk

参考代码

Java版本

class Solution {
    //递归
    public ListNode reverseList(ListNode head) {
        if(head==null || head.next==null){
            return head;
        }
        ListNode newHead = reverseList(head.next);
        head.next.next = head;
        head.next = null;   //避免成环
        return newHead;
    }
}

/***迭代
    public ListNode reverseList(ListNode head) {
        ListNode pre = null;
        ListNode nex = null;
        while(head!=null){
            nex = head.next;
            head.next = pre;
            pre = head;
            head = nex;
        }
        return pre;
    }
****/
// 关注TechGuide,大厂笔经面经闪电速递!

CPP版本

class Solution {
public:
	// 递归
    ListNode* reverseList(ListNode* head) {
        if (!head || !head->next) {
            return head;
        }
        ListNode* newHead = reverseList(head->next);
        head->next->next = head;
        head->next = nullptr;
        return newHead;
    }
}
/***迭代
class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        ListNode* prev = nullptr;
        ListNode* curr = head;
        while (curr) {
            ListNode* next = curr->next;
            curr->next = prev;
            prev = curr;
            curr = next;
        }
        return prev;
    }
}
***/
// 关注TechGuide,大厂笔经面经闪电速递!
创作不易,你的鼓励是我创作的动力,如果你有收获,点个赞吧👍
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值