【链表OJ 2】反转链表

这篇具有很好参考价值的文章主要介绍了【链表OJ 2】反转链表。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言: 

        🎈欢迎大家来到Dream_Chaser~的博客🎈

        🚩本文收录于 C--数据结构刷题的专栏中 -->http://t.csdn.cn/n6UEP

        首先欢迎大家的来访,其次如有错误,非常欢迎大家的指正,互相学习进步。

一.反转链表

来源:206. 反转链表 - 力扣(LeetCode)

题目:

【链表OJ 2】反转链表,C--数据结构刷题,链表,数据结构,c语言,开发语言,笔记,vscode

1.迭代法

思路:

  1. 首先,检查链表头节点是否为空。如果为空,表示链表为空,直接返回NULL。

  2. 定义三个指针变量:n1n2n3。初始时,n1指向NULL,n2指向头节点head,n3指向n2的下一个节点。

  3. 进入循环,条件是n2不为NULL。循环的目的是将当前节点n2的指针指向它的前一个节点n1,实现反转。

  4. 在循环内部,首先将n2next指针指向n1,完成反转操作。

  5. 然后,更新n1n2n3的值。将n2赋值给n1,将n3赋值给n2,同时判断n3是否为NULL,如果不为NULL,则将n3更新为n3的下一个节点。

  6. 当循环结束时,所有节点都被反转了,n1指向原链表的最后一个节点,也就是反转后的链表的头节点

  7. 返回n1,作为反转后的链表的头节点

动图演示:

【链表OJ 2】反转链表,C--数据结构刷题,链表,数据结构,c语言,开发语言,笔记,vscode

struct ListNode* reverseList(struct ListNode* head) {
    if (head == NULL)
        return NULL;
    struct ListNode* n1 = NULL;
    struct ListNode* n2 = head;
    struct ListNode* n3 = n2->next;
    while (n2)
    {
        n2->next = n1;

        n1 = n2;
        n2 = n3;
        if (n3)//加上这里的原因,当n2指向最后一个结点时.此时n3已经为NULL
            n3 = n3->next;//若对空指针解引用就会出现异常
    }
    return n1;
}

 代码执行: 

【链表OJ 2】反转链表,C--数据结构刷题,链表,数据结构,c语言,开发语言,笔记,vscode

注意:如果去掉条件if(n3)则会出现问题

原因: 

 if (n3)  加上此条件的原因,当n2指向最后一个结点时.此时n3已经为NULL
            n3 = n3->next;//若对空指针解引用就会出现异常

 执行: 

【链表OJ 2】反转链表,C--数据结构刷题,链表,数据结构,c语言,开发语言,笔记,vscode

2.头插法

  1. 创建两个指针变量:currheadcur用于迭代遍历原始链表,rhead用于指向反转后的链表的头部。

  2. 进入while循环,循环条件为cur不为NULL,即还未遍历完原始链表。

  3. 在循环内部,首先创建一个指针变量next,用于保存cur的下一个节点的地址,以防止丢失。

  4. 执行头插操作,将cur节点插入到反转链表的头部。将curnext指针指向rhead,实现插入操作。然后更新rhead,使其指向cur,将cur成为新的头部。

  5. 更新cur,使其指向next,继续迭代遍历原始链表的下一个节点。

  6. 循环结束后,原始链表遍历完毕,整个链表已经完成反转。返回rhead,即为反转后的链表的头部

动图演示:

【链表OJ 2】反转链表,C--数据结构刷题,链表,数据结构,c语言,开发语言,笔记,vscode

struct ListNode* reverseList(struct ListNode* head) {
       struct ListNode* cur=head,*rhead=NULL;
      while(cur)
      {
      struct ListNode* next=cur->next;
     
      //头插
      cur->next=rhead;
      rhead=cur;
     //迭代
      cur=next;
      } 
      return rhead;
}

执行:

【链表OJ 2】反转链表,C--数据结构刷题,链表,数据结构,c语言,开发语言,笔记,vscode

        本文到此结束,如有错误,欢迎大家指正,感谢来访。🚩文章来源地址https://www.toymoban.com/news/detail-656067.html

到了这里,关于【链表OJ 2】反转链表的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【数据结构刷题】数组oj

    题目: https://leetcode.cn/problems/remove-element/ 写一段原地移除数组中所有的元素val,要求时间复杂度为O(N^2),空间复杂度为O(1)的代码实现: 思路:遇到这个val后面的元素往前面覆盖。 int main() { int nums[] = { 0, 1, 2, 2, 3, 0, 4, 2 }; int numsSize = sizeof(nums) / sizeof(nums[0]); int val = 2; 写一段原地移

    2024年02月14日
    浏览(31)
  • 【数据结构和算法】反转链表

    Java基础合集 数据结构与算法合集 设计模式合集 多线程合集 分布式合集 ES合集 其他系列文章导航 文章目录 前言 一、题目描述 二、题解 2.1 方法一:迭代(双指针) 2.2 方法二:递归 三、代码 3.1 方法一:迭代(双指针) 3.2 方法二:递归 四、复杂度分析 4.1 方法一:迭代

    2024年01月18日
    浏览(51)
  • 数据结构——链表OJ题

    目录   1.给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。 2.给定一个带有头结点 head 的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。 3.变形题:找到链表中倒数第k个

    2024年02月21日
    浏览(39)
  • 【数据结构初阶】链表OJ

    OJ 方案一: 题目解析: 方案二: 题目解析:把原链表遍历一遍,插入新链表 OJ 题目解析: OJ 题目解析: OJ 题目解析: OJ 题目解析: OJ 题目解析: OJ 题目解析: OJ 题目解析: 定义快慢指针,使快指针先走与慢指针同步。然后同时走看是否相交 OJ 题目解析: OJ 题目解析:

    2024年02月05日
    浏览(47)
  • 数据结构——图解链表OJ题目

            学完了单链表之后,我们对其基本结构已经有了一定的了解,接下来我们通过一些题目强化对链表的理解,同时学习一些面试笔试题目的新思路以及加强对数据结构单链表的掌握。  目录 题目一.876. 链表的中间结点 - 力扣(LeetCode) 题目二:21. 合并两个有序链表

    2024年02月04日
    浏览(62)
  • 【数据结构OJ题】链表分割

    原题链接:https://www.nowcoder.com/practice/0e27e0b064de4eacac178676ef9c9d70?tpId=8tqId=11004rp=2ru=/activity/ojqru=/ta/cracking-the-coding-interview/question-ranking 目录 1. 题目描述 2. 思路分析 3. 代码实现 整体思路: 创建两个链表 ,分别存放 小于x的结点 和 大于等于x的结点 , 分别进行尾插 。 这道题目使

    2024年02月12日
    浏览(43)
  • 【数据结构OJ题】环形链表

    原题链接:https://leetcode.cn/problems/linked-list-cycle/description/ 目录 1. 题目描述 2. 思路分析 3. 代码实现 整体思路: 定义 快慢指针fast,slow ,如果 链表确实有环 , fast指针一定会在环内追上slow指针。 即慢指针一次走一步,快指针一次走两步,两个指针从链表起始位置开始运行,

    2024年02月12日
    浏览(40)
  • 数据结构刷题训练:设计循环队列(力扣OJ)

    目录 文章目录 前言 1. 题目:设计循环队列 2. 思路 3. 分析  3.1 定义循环队列  3.2 创建队列  3.3 判空和判满  3.4 入队  3.5 出队  3.6 取队头队尾数据  3.7 销毁队列  4. 题解 总结         当谈到队列数据结构时,很多人可能会想到普通的队列,即先进先出(FIFO)的数据结

    2024年02月13日
    浏览(47)
  • 【数据结构与算法】手撕链表OJ题

    给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 思路一 :一种比较普遍的方式,边遍历边找不同。我们可以通过定义两个指针,一个指向头节点,一个置为NULL。当遇到值为相同的时候,直接跳过去。指向下一位

    2024年02月10日
    浏览(40)
  • 【数据结构OJ题】移除链表元素

    原题链接:力扣  给你一个链表的头节点  head  和一个整数  val  ,请你删除链表中所有满足  Node.val == val  的节点,并返回 新的头节点  。  方法一:原地删除节点 思路:  首先,定义两个指针:prve和cur。它们会在遍历链表的过程中分别指向当前节点的前一个节点和当前

    2024年02月11日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包