Leetcode刷题
力扣经典算法题之——链表反转
题目如下:
题目初始代码:
我们首先通过题目的初始代码来分析一下:
题目首先给了我们一个结构体
写过链表的家人们都知道 val 是数据域,next是指针域,记录着下一个节点的地址
题目中还给了我们一个结构体类型的函数,所以我们题目的最后是要返回一个结构体指针的——首节点!!
初始代码分析完了,现在我们来分析题目
首先呢,我们的链表分为带头节点和不带头节点两种!!
这道题呢就是典型的不带头节点的类型
通过题目的示例,我们直接也可以看到,就是普普通通的反转,很容易理解
下来我们来分析一下代码具体应该怎们写,理一理思路
最简单也是最容易想到的就是创建一个新的链表,然后通过头插的方法来完成这个题目
话不多说上图!
初始就是这样滴,我们创建了一个新的链表,将其的首节点设置为空,命名其为newnode.
下一步就要开始头插了,我们来看图理解一下:
我们需要将原链表的首节点头插到新链表上,但是!!!如果我们这样做了,那么就要断开 head 和 head->next 的链接,我们就找不到head->next的位置了,那么我们该怎们办呢?
上图!!!
这样就不会出现找不到的情况了
看似完美,我们来写一下代码
typedef struct ListNode ListNod;
struct ListNode* reverseList(struct ListNode* head) {
ListNod* newhead=NULL;
ListNod* pcur=head;
ListNod* temp=pcur->next;
pcur->next=newhead;
newhead=pcur;
}
差不多是这样,这里我们使用了中间变量temp来记录pcur->next,方便我们使用,在我们头插之后,将头插过来的新元素设置为新链表的头节点。(注意:这里我使用了tyedef对结构体重命名,方便使用)
逻辑是这样没错,下来我们加一个循环遍历链表就好啦,循环条件我们应该以pcur为不为空来判断,如果为空,那就是遍历完了
代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
typedef struct ListNode ListNod;
struct ListNode* reverseList(struct ListNode* head) {
ListNod* newhead=NULL;
ListNod* pcur=head;
while(pcur){
ListNod* temp=pcur->next;
pcur->next=newhead;
newhead=pcur;
pcur=temp;
}
return newhead;
}
OK啦,直接0ms!!!
个人感觉奥,在我们的循环开始之前可以加一个判断
if(head==NULL)
{
return NULL;
}
判读一下,如果链表为空,直接返回NULL就可以了,完全没必要继续执行下面的语句了。