天天看点

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开始,通过改变指向来实现翻转:

leetcode刷题day4思路代码实现总结

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

leetcode刷题day4思路代码实现总结

为什么需要三个呢,首先先假设只有一个n1的情况:

首先让n1保存好A的地址,让A改变指向指向空:

leetcode刷题day4思路代码实现总结

这样n1虽然保存了A的地址,但是要让B改变指向指向A,也就是n1,显然需要另外一个结点n2来保存B的地址:

leetcode刷题day4思路代码实现总结

这时候可以安心的把B指向A(B的地址被n2保存了):

leetcode刷题day4思路代码实现总结

但是这时候出现了个问题,B现在改变了指向,已经访问不到后面了,于是我们在引入一个结点n3用来保存C的地址:

leetcode刷题day4思路代码实现总结

在这之后我们只要每次让n2改变结点就好了,然后n1 = n2,n2 = n3,而n3因为指向C,解应用就会的往后走得到D。

leetcode刷题day4思路代码实现总结

循环一直到下面这时候停止,因为此时的n3已经不能再解应用了。

leetcode刷题day4思路代码实现总结

但这时候最后一个箭头还没有反过来,所以在循环外需要加一句

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思路代码实现总结

总结

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

继续阅读