【算法】反转链表的四种方法(C语言)

2024-07-19 1019阅读

文章目录

  • 方法一 原地反转
  • 方法二 迭代
  • 方法三 递归
  • 方法四 新建链表法

    206. 反转链表

    给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。

    示例 1:

    【算法】反转链表的四种方法(C语言)

    输入:head = [1,2,3,4,5] 输出:[5,4,3,2,1]

    示例 2:

    【算法】反转链表的四种方法(C语言)

    输入:head = [1,2] 输出:[2,1]

    示例 3:

    输入:head = [] 输出:[]

    提示:

    • 链表中节点的数目范围是 [0, 5000]
    • -5000 next:1.连:第一步先将pre所在节点和cur->next所在节点连接起来,将当前节点 cur 从链表中移除,并把链表连接起来。

      【算法】反转链表的四种方法(C语言)

      cur->next = head;2.掉:将cur的next指向head,将cur插入到head的前面,以便将其放置到链表的前面,成为新的头节点。 【算法】反转链表的四种方法(C语言)

      head = cur;3.接:更新head,使其指向当前的cur

      【算法】反转链表的四种方法(C语言)

      cur = pre->next;4.移:更新cur,移动到下一个待反转的节点

      【算法】反转链表的四种方法(C语言)

      struct ListNode* reverseList(struct ListNode* head) {
          if (head == NULL) {
              return head;
          }
          struct ListNode* cur = head->next; 
          struct ListNode* pre = head; 
          while (cur) {
              pre->next = cur->next; 
              cur->next = head; 
              head = cur;   
              cur = pre->next; 
          }
          return head; 
      }
      

      方法二 迭代

      temp保存cur的下一个节点,以防止反转时丢失链表信息。

      【算法】反转链表的四种方法(C语言)

      cur->next = pre;将cur的下一个指针指向pre,实现反转。

      【算法】反转链表的四种方法(C语言)

      更新pre为当前的cur,为下一次迭代做准备。

      更新cur为保存的下一个节点temp,继续迭代。

      【算法】反转链表的四种方法(C语言)

      通过不断改变指针的指向将链表进行反转。pre充当新链表的头节点,当cur为NULL循环停止,返回pre

      struct ListNode* reverseList(struct ListNode* head) {
          struct ListNode* pre = NULL;
          struct ListNode* cur = head;
          while (cur != NULL) {
              struct ListNode* temp = cur->next;
              cur->next = pre;
              pre = cur;
              cur = temp;
          }
          return pre;
      }
      

      方法三 递归

      我们可以通过迭代的方法来得到递归方法

      观察reverse函数,

      函数声明中pre指针指向的为NULL,cur指针指向的为head,正如递归中声明并初始化的pre和cur指针

      递归结束条件为cur为NULL,返回pre

      同样temp保存cur的下一个节点,以防止反转时丢失链表信息。

      然后进行反转cur->next = pre;

      pre 为当前已反转部分的头节点,cur为当前待反转的节点。

      然后调用递归,将cur作为新的pre传入下一层,将temp作为新的cur传入下一层。

      实现了链表的递归反转

      struct ListNode* reverse(struct ListNode* pre, struct ListNode* cur) {
          if (!cur){
              return pre;
          }
          struct ListNode* temp = cur->next;
          cur->next = pre;
          //将cur作为pre传入下一层
          //将temp作为cur传入下一层,改变其指针指向当前cur
          return reverse(cur, temp);
      }
      struct ListNode* reverseList(struct ListNode* head) {
          return reverse(NULL, head);
      }
      

      方法四 新建链表法

      struct ListNode* newNode = (struct ListNode*)malloc(sizeof(struct ListNode));

      newNode->val = head->val;

      新建一个链表,并初始化

      newNode->next = newHead;将新节点插入到新链表的头部

      【算法】反转链表的四种方法(C语言)

      newHead = newNode;

      【算法】反转链表的四种方法(C语言)

      head = head->next;

      【算法】反转链表的四种方法(C语言)

      遍历原链表,使用头插法新建链表,并不断移动newHead指针,当原链表头指针指向NULL最终返回newHead

      struct ListNode* reverseList(struct ListNode* head) {
          struct ListNode* newHead = NULL;
          while (head) {
              // 创建一个新节点
              struct ListNode* newNode = (struct ListNode*)malloc(sizeof(struct ListNode));
              newNode->val = head->val;        
              // 将新节点插入到新链表的头部
              newNode->next = newHead;
              newHead = newNode;
              // 移动到原链表的下一个节点
              head = head->next;
          }
          return newHead;
      }
      


      感谢您的阅读

VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]