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的主要内容,如果未能解决你的问题,请参考以下文章