IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 反转链表 II ( LeetCode 92 ) -> 正文阅读

[数据结构与算法]反转链表 II ( LeetCode 92 )

题目链接

https://leetcode.cn/problems/reverse-linked-list-ii/

题目解析

方法1:递归算法

思想:将需要旋转的部分取出,利用递归方法(参考:https://editor.csdn.net/md/?articleId=124715935)进行链表反转,然后再与原链表其余部分进行链接。

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode reverseBetween(ListNode head, int left, int right) {
        if(left==right)
        {
            return head;
        }
        ListNode dummyNode=new ListNode(-1);
        dummyNode.next=head;

        ListNode pre=dummyNode;
        for(int i=0;i<left-1;i++)
        {
            pre=pre.next;//左边界的前一个节点
        }

        ListNode leftNode=pre.next;//左节点
        ListNode rightNode=pre;
        for(int i=0;i<right-left+1;i++)
        {
            rightNode=rightNode.next;//右节点
        }
        ListNode cur=rightNode.next;//右节点的后一个节点

        pre.next=null;
        rightNode.next=null;


        reverseList(leftNode);//旋转列表
        pre.next=rightNode;//左节点连接
        leftNode.next=cur;//右节点连接

        return dummyNode.next;
    }
    public ListNode reverseList(ListNode leftNode)
    {
        ListNode head=leftNode;
        if(head==null || head.next==null)
        {
            return head;
        }
        ListNode curr=reverseList(head.next);
        head.next.next=head;
        head.next=null;
        return curr;
    }
}

方法2:遍历

思想:从left遍历到right,在遍历的过程中反转链表
原始列表及需要反转的区间

第一步:

cur.next=next.next
第二步:
next.next=pre.next
第三步:
pre.next=next
注:上述图片为视频中的截图,具体演示过程可参考https://leetcode.cn/problems/reverse-linked-list-ii/solution/92-fan-zhuan-lian-biao-ii-by-chen-wei-f-sjcn/

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode reverseBetween(ListNode head, int left, int right) {
        if(left==right)
        {
            return head;
        }
        ListNode dummyNode=new ListNode(-1);
        dummyNode.next=head;

        ListNode pre=dummyNode;
        for(int i=0;i<left-1;i++)
        {
            pre=pre.next;//找到左边界的前一个节点
        }

        ListNode middleNode=pre.next;//找到左节点
        ListNode temp;
        for(int i=0;i<right-left;i++)
        {
            temp=middleNode.next;
            middleNode.next=temp.next;
            temp.next=pre.next;
            pre.next=temp;
        }

        return dummyNode.next;
    }
}
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-05-18 17:54:13  更:2022-05-18 17:55:21 
 
开发: 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/26 1:24:29-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码