Leetcode刷题笔记之链表篇206. 反转链表

Posted 大家好我叫张同学

tags:

篇首语:本文由小常识网(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. 反转链表的主要内容,如果未能解决你的问题,请参考以下文章

Leetcode刷题笔记之链表篇141. 环形链表

Leetcode刷题笔记之链表篇160. 相交链表

Leetcode刷题笔记之链表篇160. 相交链表

Leetcode刷题笔记之链表篇234. 回文链表

Leetcode刷题笔记之链表篇141. 环形链表

Leetcode刷题笔记之链表篇876. 链表的中间结点