[LeetCode]反转链表

Posted Mr、Jerry

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[LeetCode]反转链表相关的知识,希望对你有一定的参考价值。

[LeetCode]反转链表


题目

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


链接:https://leetcode-cn.com/problems/reverse-linked-list/submissions/


分析

这里我们用两种方法实现:

①调整链表方向

按照上述分析,我们可以得出代码:

struct ListNode* reverseList(struct ListNode* head){
    struct ListNode* n1,*n2,*n3;
    n1 = NULL;
    n2 = head;
    n3 = head->next;

    while(n2)
    {
        n2->next = n1;
        n1 = n2;
        n2 = n3;
        if(n3)
        	n3 = n3->next;
    }
    return n1;
}

可当我们运行时,我们得出的结果为:


这里说我们存在空指针的问题,我们再一次画图分析


此时我们的n3指针指向空,我们在这一趟进行调整元素间的箭头时,调整失败,所以我们增加对n3
指针的判断

    while(n2)
    {
        n2->next = n1;
        n1 = n2;
        n2 = n3;
        if(n3)
        	n3 = n3->next;
    }

这个时候我们在运行代码,我们得出的结果为

这个时候我们得出我们为考虑如果我们要反转的链表为NULL的情况,所以我们增加对链表的判断

if(head == NULL)
        return head;

此时,我们再一次运行代码得出


②头插法

这里我们对题目中给出的例子再进行分析

如果有不熟悉链表中头插接口的实现,可以浏览/复习
https://blog.csdn.net/weixin_52664715/article/details/120336834?spm=1001.2014.3001.5501

struct ListNode* reverseList(struct ListNode* head){
    struct ListNode* cur = head;
    struct ListNode* newhead = NULL;
    while(cur)
    {
        struct ListNode* next = cur->next;//我们先保存cur的下一个节点的地址
        cur->next = newhead;//让cur指向newhead
        newhead = cur;//让newhead移动,为了让下一个元素指向头结点
        cur = next;
    }
    return newhead;
}

此时,我们运行代码得出

代码

struct ListNode* reverseList(struct ListNode* head){
    if(head == NULL)
        return head;

    struct ListNode* n1,*n2,*n3;
    n1 = NULL;
    n2 = head;
    n3 = head->next;

    while(n2)
    {
        n2->next = n1;
        n1 = n2;
        n2 = n3;
        if(n3)
            n3 = n3->next;
    }

    return n1;
    
}

struct ListNode* reverseList(struct ListNode* head){
    struct ListNode* cur = head;
    struct ListNode* newhead = NULL;
    while(cur)
    {
        struct ListNode* next = cur->next;
        cur->next = newhead;
        newhead = cur;
        cur = next;
    }
    return newhead;
}

总结

我们在解决题目时,经常会使用我们在学习时学习的接口内容,所以我们对常见的接口进行复习和扩展,因为我们上述题目在使用头插法时与我们学习时的接口内容并不相同,但两者的思路相同

以上就是我对这种方法的个人理解

上述内容如果有错误的地方,还麻烦各位大佬指教【膜拜各位了】【膜拜各位了】

以上是关于[LeetCode]反转链表的主要内容,如果未能解决你的问题,请参考以下文章

剑指offerJZ15——反转链表。leetcode206.反转链表

LeetCode 206. 反转链表

LeetCode 92. 反转链表 II

leetcode之反转链表图文详解

Leetcode234. 回文链表(快慢指针+反转链表)

leetcode-反转链表-46