题目
给你单链表的头节点 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;
}
总结
我们在解决题目时,经常会使用我们在学习时学习的接口内容,所以我们对常见的接口进行复习和扩展,因为我们上述题目在使用头插法时与我们学习时的接口内容并不相同,但两者的思路相同
以上就是我对这种方法的个人理解
上述内容如果有错误的地方,还麻烦各位大佬指教【膜拜各位了】【膜拜各位了】