leetcode刷题day4

Posted 我是晓伍

tags:

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

本题来源于206. 反转链表

题目如下:
给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。

示例 1:

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

输入:head = [1,2]
输出:[2,1]
示例 3:

输入:head = []
输出:[]

提示:

链表中节点的数目范围是 [0, 5000]
-5000 <= Node.val <= 5000

思路

我的思路是从A开始,通过改变指向来实现翻转:

在这里插入图片描述
首先,要把这个链表倒过来,我们需要三个结点n1,n2,n3作为临时存储和移动的变量。
在这里插入图片描述

为什么需要三个呢,首先先假设只有一个n1的情况:
首先让n1保存好A的地址,让A改变指向指向空:
在这里插入图片描述
这样n1虽然保存了A的地址,但是要让B改变指向指向A,也就是n1,显然需要另外一个结点n2来保存B的地址:
在这里插入图片描述
这时候可以安心的把B指向A(B的地址被n2保存了):
在这里插入图片描述
但是这时候出现了个问题,B现在改变了指向,已经访问不到后面了,于是我们在引入一个结点n3用来保存C的地址:
在这里插入图片描述
在这之后我们只要每次让n2改变结点就好了,然后n1 = n2,n2 = n3,而n3因为指向C,解应用就会的往后走得到D。
在这里插入图片描述
循环一直到下面这时候停止,因为此时的n3已经不能再解应用了。
在这里插入图片描述
但这时候最后一个箭头还没有反过来,所以在循环外需要加一句n2->next = n1; n1 = n2; n2 = n3;

到这,我们也分析出来了循环停止的条件是n3==NULL

所以代码如下:

代码实现

struct ListNode *reverseList(struct ListNode *head)
{
    if (head == NULL)
    {
        return NULL;
    }
    struct ListNode *n1 = NULL;
    struct ListNode *n2 = head;
    struct ListNode *n3 = head->next;
    while (n3 != NULL)
    {
        n2->next = n1; //改方向
        //迭代动起来
        n1 = n2;
        n2 = n3;
        n3 = n3->next;
    }
    n2->next = n1;
    n1 = n2;
    return n1;
}

在这里插入图片描述

总结

这道题的难点就在于如何控制循环的起始和结束位置,只要控制好了就没问题。

以上是关于leetcode刷题day4的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode刷题笔记-动态规划-day4

LeetCode刷题笔记-数据结构-day4

LeetCode刷题笔记-数据结构-day4

leetcode刷题day4

leetcode刷题day4

Leetcode刷题Python LeetCode 2038. 如果相邻两个颜色均相同则删除当前颜色