力扣206. 反转链表

news/2024/11/18 4:36:43/

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

示例 1:

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

示例 2:

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

示例 3:

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

提示:

  • 链表中节点的数目范围是 [0, 5000]
  • -5000 <= Node.val <= 5000

进阶:链表可以选用迭代或递归方式完成反转。你能否用两种方法解决这道题?

思路

如果再定义一个新的链表,实现链表元素的反转,其实这是对内存空间的浪费。

其实只需要改变链表的next指针的指向,直接将链表反转 ,而不用重新定义一个新的链表,如图所示:

206_反转链表

之前链表的头节点是元素1, 反转之后头结点就是元素5 ,这里并没有添加或者删除节点,仅仅是改变next指针的方向。

那么接下来看一看是如何反转的呢?

我们拿有示例中的链表来举例

首先定义一个cur指针,指向头结点,再定义一个pre指针,初始化为null。

然后就要开始反转了,首先要把 cur->next 节点用tmp指针保存一下,也就是保存一下这个节点。

为什么要保存一下这个节点呢,因为接下来要改变 cur->next 的指向了,将cur->next 指向pre ,此时已经反转了第一个节点了。

接下来,就是循环走如下代码逻辑了,继续移动pre和cur指针。

最后,cur 指针已经指向了null,循环结束,链表也反转完毕了。 此时我们return pre指针就可以了,pre指针就指向了新的头结点。

 Java:

// 双指针
class Solution {public ListNode reverseList(ListNode head) {ListNode prev = null;ListNode cur = head;ListNode temp = null;while (cur != null) {temp = cur.next;// 保存下一个节点cur.next = prev;prev = cur;cur = temp;}return prev;}
}
// 递归 
class Solution {public ListNode reverseList(ListNode head) {return reverse(null, head);}private ListNode reverse(ListNode prev, ListNode cur) {if (cur == null) {return prev;}ListNode temp = null;temp = cur.next;// 先保存下一个节点cur.next = prev;// 反转// 更新prev、cur位置// prev = cur;// cur = temp;return reverse(cur, temp);}
}
// 从后向前递归
class Solution {ListNode reverseList(ListNode head) {// 边缘条件判断if(head == null) return null;if (head.next == null) return head;// 递归调用,翻转第二个节点开始往后的链表ListNode last = reverseList(head.next);// 翻转头节点与第二个节点的指向head.next.next = head;// 此时的 head 节点为尾节点,next 需要指向 NULLhead.next = null;return last;} 
}

使用虚拟头结点解决链表翻转

使用虚拟头结点,通过头插法实现链表的翻转(不需要栈)

// 迭代方法:增加虚头结点,使用头插法实现链表翻转
public static ListNode reverseList1(ListNode head) {// 创建虚头结点ListNode dumpyHead = new ListNode(-1);dumpyHead.next = null;// 遍历所有节点ListNode cur = head;while(cur != null){ListNode temp = cur.next;// 头插法cur.next = dumpyHead.next;dumpyHead.next = cur;cur = temp;}return dumpyHead.next;
}

使用栈解决反转链表的问题

  • 首先将所有的结点入栈
  • 然后创建一个虚拟虚拟头结点,让cur指向虚拟头结点。然后开始循环出栈,每出来一个元素,就把它加入到以虚拟头结点为头结点的链表当中,最后返回即可。
public ListNode reverseList(ListNode head) {// 如果链表为空,则返回空if (head == null) return null;// 如果链表中只有只有一个元素,则直接返回if (head.next == null) return head;// 创建栈 每一个结点都入栈Stack<ListNode> stack = new Stack<>();ListNode cur = head;while (cur != null) {stack.push(cur);cur = cur.next;}// 创建一个虚拟头结点ListNode pHead = new ListNode(0);cur = pHead;while (!stack.isEmpty()) {ListNode node = stack.pop();cur.next = node;cur = cur.next;}// 最后一个元素的next要赋值为空cur.next = null;return pHead.next;
}

采用这种方法需要注意一点。就是当整个出栈循环结束以后,cur正好指向原来链表的第一个结点,而此时结点1中的next指向的是结点2,因此最后还需要cur.next = null


http://www.ppmy.cn/news/963987.html

相关文章

抖音回应全国上线外卖:仍在试点中;微软发布 ChatGPT 版搜索引擎;中国计算机图形学巨匠齐东旭教授逝世|极客头条...

「极客头条」—— 技术人员的新闻圈&#xff01; CSDN 的读者朋友们早上好哇&#xff0c;「极客头条」来啦&#xff0c;快来看今天都有哪些值得我们技术人关注的重要新闻吧。 整理 | 梦依丹 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 一分钟速览新闻点&#…

微软AI宇宙日益完善!ChatGPT默认用必应搜索,Windows Copilot登场!

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 本文章仅用于学术分享&#xff0c;如有侵权请联系删除 作者丨机器之心编辑部 来源丨机器之心 今年的微软 Build 大会&#xff0c;高度聚焦生成式 AI&#xff0c;联手OpenAI打造一个大宇宙。 微软在5…

Windows Copilot登场,ChatGPT默认用必应搜索,微软联手OpenAI的大宇宙来了

机器之心报道 机器之心编辑部 今年的微软 Build 大会&#xff0c;高度聚焦生成式 AI&#xff0c;联手OpenAI打造一个大宇宙。 最近几个月&#xff0c;微软一直忙于在自身的许多产品和服务中构建生成式 AI&#xff0c;包括搜索引擎 Bing、浏览器 Edge、GitHub 和 Office 生产力套…

微软欲用 ChatGPT 扶必应“上位”,对抗 Google!

ChatGPT 的到来&#xff0c;正促使搜索引擎的竞争进入下半场。 整理 | 屠敏 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 一直以来&#xff0c;Google 搜索引擎的市场占比一骑绝尘&#xff0c;让很多竞争者望而却步。 不过&#xff0c;现如今&#xff0c;随着一…

学生利用“提示符注入”方法,攻破ChatGPT版必应搜索

聚焦源代码安全&#xff0c;网罗国内外最新资讯&#xff01; 编译&#xff1a;代码卫士 微软上线必应 (Bing) 新版Chat 搜索后&#xff0c;人们开始试图让改机器人吐露更多不允许说的内容。在斯坦福大学就读计算机科学专业的学生 Kevin Liu获得成功。 去年9月&#xff0c;数据科…

走进开源项目办公室(下)

开源项目办公室&#xff08;Open Source Program Office&#xff09;是阐明、支持、培育、共享和发展开源代码的特定场所。它可以帮助企业明晰地创建和执行开源项目的战略&#xff0c;成为保障领导、开发者、营销人员和其他员工成功运营开源项目的工具。 注&#xff1a;此处的…

自然语言处理复习笔记

自然语言处理期末复习笔记 复习摘要 大致梳理了下《自然语言处理》这门课程的知识纲要 作者&#xff1a; Hongtauo CSDN链接&#xff1a;(27条消息) Hongtauo的博客_CSDN博客-笔记,实验题,NLP学习之路领域博主 GitHub&#xff1a;https://github.com/Hongtauo/NLP_notebook…

【项目实战】SpringBoot+uniapp+uview2打造一个企业黑红名单吐槽小程序

避坑宝 v1.0.0 基于SpringBootuniapp企业黑红名单吐槽小程序 &#x1f4da;项目介绍 避坑宝 【避坑宝】企业黑红名单吐槽小程序是一个具有吐槽发布企业信息的一个平台&#xff0c;言论自由&#xff0c;评判自定&#xff0c;便于我们打工人分辨企业好坏。技术栈基于SpringBoot…