篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Leetcode刷题笔记之链表篇206. 反转链表相关的知识,希望对你有一定的参考价值。
😈博客主页:🐼大家好我叫张同学🐼
💖 欢迎点赞 👍 收藏 💗留言 📝 欢迎讨论! 👀
🎵本文由 【大家好我叫张同学】 原创,首发于 CSDN 🌟🌟🌟
✨精品专栏(不定时更新) 【数据结构+算法】 【做题笔记】【C语言编程学习】
☀️ 精品文章推荐
【C语言进阶学习笔记】三、字符串函数详解(1)(爆肝吐血整理,建议收藏!!!)
【C语言基础学习笔记】+【C语言进阶学习笔记】总结篇(坚持才有收获!)
知之者不如好之者,好之者不如乐之者,学海无涯,当苦中作乐,岂不快哉! |
为什么要写刷题笔记
?
写博客
的过程也是对自己刷题过程的梳理
和总结
,是一种耗时
但有效
的方法。
当自己分享的博客帮助到他人时,又会给自己带来额外的快乐和幸福。
(刷题的快乐+博客的快乐,简直是奖励翻倍,快乐翻倍
有木有QAQ🙈)
给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。
要反转链表,一个很容易想到的方法就是:直接将链表结点之间的链接关系反过来
。例如原来为1->2
,反过来就是1<-2
,也就是2->1
。
struct ListNode* reverseList(struct ListNode* head)
if(!head)
return NULL;
struct ListNode* prev = NULL;
struct ListNode* cur = head;
while(cur)
struct ListNode* next = cur->next;
cur->next = prev;
prev = cur;
cur = next;
return prev;
除了使用这种迭代的方式之外,我们还可以使用头插法。将原来的链表头插
到一个新的链表中,那么链表的方向就会反过来。
struct ListNode* reverseList(struct ListNode* head)
if(head == NULL)
return head;
struct ListNode* newhead = NULL;
struct ListNode* cur = head;
while(cur)
struct ListNode* next = cur->next;
cur->next = newhead;
newhead = cur;
cur = next;
return newhead;
除了以上两者方式外,还有一种递归实现的方法,递归版本稍微复杂一些,其关键在于反向工作。 假设列表的其余部分已经被反转,现在我们应该如何反转它前面的部分?
若从节点n(k+1)到n(m)已经被反转,而我们正处于n(k)。
我们希望n(k+1)的下一个节点指向n(k)。
所以n(k)->next->next = n(k).
要小心的是 n(1)的下一个必须指向NULL(空指针)。如果我们忽略了这一点,链表中可能会产生循环。
struct ListNode* reverseList(struct ListNode* head)
if(head == NULL || head->next == NULL)
return head;
struct ListNode* newhead = reverseList(head->next);
head->next->next = head;
head->next = NULL;
return newhead;
以上是关于Leetcode刷题笔记之链表篇206. 反转链表的主要内容,如果未能解决你的问题,请参考以下文章