| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> LeetCode 206:反转链表 -> 正文阅读 |
|
[数据结构与算法]LeetCode 206:反转链表 |
题目描述: 给定一个单链表的头节点head,将链表反转,并将所得结果返回。 示例1: 输入:head = [1,2,3,4,5] 输出:[5,4,3,2,1] ?图示如下: ? 示例2: 输入:head = [1,2] 输出:[2,1] 图示如下:? ? 示例3: 输入:head = [] 输出:[] ?解法一:双指针迭代法。 思路:根据单链表的特点,对于任一节点而言,仅指向它的直接后继节点。因此,要想反转链表,就需要改变每个节点的next指向。如果仅使用一个变量进行链表反转是达不到预期目标的,以示例1为例,假设让节点2的next指向了节点1,那么就无从获知原来链表中节点2的下一节点信息,因为节点2的next指向已经变为节点1。所以,在改变节点2的next之前,应该对节点2的下一个节点使用变量进行标记。具体如下图所示: ?因此,可将反转链表分为两种情况: (1)特殊情况:链表为空或链表只有一个节点,无需反转,直接返回head即可。 (2)一般情况:如上图所示,cur代表循环变量,temp用于标记cur的next值,pre代表cur的前一==节点。当且仅当cur值为null时,遍历结束。 代码:
解法二:递归法。 思路:递归的思想在于将一个大问题细化为具有相同性质的小问题。以示例1为例,可以将反转整个链表的操作划分为四个子问题。因此,研究出一个子问题的解决方案,之后推广到整个链表即可。 ? ? ? ? 以节点1和节点2的反转过程为例,在初始条件下传入head,此时head指向的是节点1,而节点2则为head.next来表示。因此,要对这两个节点进行反转,只需要两个步骤: (1)节点2的next指向节点1,即:head.next.next = head; (2)节点1的next置为null,即:head.next = null; 如下图: ?因此,推广到整个链表。对于整个链表来讲,为了防止节点2反转之后,与节点2之间不能断开,故而需要在反转节点之间对节点2的next进行存储,如同解法1中一般。这里借助递归的特性,即:递归类似于栈的功能,在反转结点之前先调用方法。如下图: ? ? 代码:
|
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/25 17:56:13- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |