您当前的位置: 首页 >  链表

TechGuide

暂无认证

  • 4浏览

    0关注

    176博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

【每日一题】JZ15 反转链表

TechGuide 发布时间:2021-09-05 20:07:25 ,浏览量:4

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

非常经典的一道手撕代码题(不过目前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,大厂笔经面经闪电速递!
创作不易,你的鼓励是我创作的动力,如果你有收获,点个赞吧👍
关注
打赏
1665329535
查看更多评论
立即登录/注册

微信扫码登录

0.0397s