当前位置: 首页 > 图灵资讯 > 技术篇> 图解LeetCode——206. 反转链表

图解LeetCode——206. 反转链表

来源:图灵教育
时间:2023-06-04 09:19:45

一、题目

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

二、示例2.1> 示例 1:

图解LeetCode——206. 反转链表_链表

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

2.2> 示例 2:

【输入】head = [1,2][输出][2,1]

2.3> 示例 3:

【输入】head = [][][输出][][][]

提示:
  • 链表中节点的数量范围是 [0, 5000]
  • -5000 <= Node.val <= 5000
三、解题思路3.1> 思路1:迭代方式

对于链表反转操作,我们可以首先选择迭代转换,即每当我们通过两个节点时,我们都可以执行next指针反转前端节点。这里需要注意的是,因为我们需要修改它next指针,因此,在遍历时,我们应该首先缓存next指针指向的原始对象,然后更改next指针。这样做的目的是继续实施遍历操作。具体操作方法见下图所示:

图解LeetCode——206. 反转链表_后端_02

3.2> 思路2:递归方式

根据主题描述,我们需要翻转原链表。然后,由于单向链表的单向性,如果我们想翻转链表,我们可以通过递归处理。具体逻辑如下:

【步骤1】每次递归都要head.next以节点为方法传输入参。[步骤2]当输入时这个节点是null或者它的nulllll,然后直接返回节点。[步骤3]当遍历最后一节点两个节点之间可以进行时间链表反转操作了。

图解LeetCode——206. 反转链表_链表_03

四、代码实现4.1> 实现1:迭代方式

class Solution {    public ListNode reverseList(ListNode head) {        ListNode pre = null, temp = null;        while (head != null) {            temp = head.next;            head.next = pre;            pre = head;            head = temp;        }        return pre;    }}

图解LeetCode——206. 反转链表_面试_04

4.2> 实现2:递归方式

class Solution {    public ListNode reverseList(ListNode head) {        if (head == null || head.next == null) return head;        ListNode node = reverseList(head.next);        head.next.next = head;        head.next = null;        return node;    }}

图解LeetCode——206. 反转链表_面试_05

以下是今天文章的内容:

写作并不容易。作者几个小时甚至几天就完成了一篇文章。我只想换取你几秒钟 点赞 & 分享 。

更多技术干货,欢迎关注微信官方账号“爪哇缪斯” ~ \(^o^)/ ~ 「干货分享,每天更新」

上一篇:

如何理解OKR

下一篇:

moment处理日期格式