LeetCode第92题反转链表 II

继续打卡算法题,今天学习的是LeetCode第92题反转链表 II,这道题目是道中等题。算法题的一些解题思路和技巧真的非常巧妙,每天看一看算法题和解题思路,我相信对我们的编码思维和编码能力有一些提升。

分析一波题目

本题是反转链表的升级版本,本题需要反转指定位置区间的链表段,我们只需要记录一下反转链表段的头部和尾部,还有前一个指针和后一个指针,等反转结束后将记录的重新指向反转后的指向即可。

这种做法比较容易理解。通过4个指针记录了反转链表关键的位置。

本题解题技巧

1、通过4个指针记录反转链表的头,尾,和前序和后继节点,代码实现比较好理解。

编码解决

java 复制代码
/**
 * 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 dumy = new ListNode();
        dumy.next = head;

        //记录待反转的前一个节点指针。
        ListNode pre = null;
        ListNode next = null;

        ListNode pre1 = null;

        //记录反转链表的头尾节点
        ListNode start = null;
        ListNode end = null;

        int index = 0;

        //遍历到的节点
        ListNode curr = dumy;
        while(curr != null) {
           // System.out.println(curr.val);
            ListNode temp =  curr.next;
            if(index == left-1) {
                pre = curr;
            }

            if(index == left) {
                start = curr;
            }

            if(index == right) {
                end = curr;
                
            }

            if(index == right + 1) {
                next = curr;
                
            }

            //开始反转
            if(index > left && index <= right) {
                //System.out.println(curr.val);
               curr.next = pre1;
               
            }

            //反转完成的时候
            if(index == right || index > right) {
                pre.next = end;
                //System.out.println(next);
                start.next = next;
            }

            pre1 = curr;
            curr = temp;

            index ++;
            System.out.println("index"+index);

        }

        return dumy.next;
    }
}

总结

1、反转链表题目,本身不难理解,但是代码实现层面需要更新节点指向,这个在编码过程中是比较难控制的。

相关推荐
顾林海几秒前
Android登录模块设计:别让“大门”变成“破篱笆”
android·经验分享·面试·架构·移动端
期待のcode9 分钟前
Java虚拟机的垃圾回收器
java·开发语言·jvm·算法
星火开发设计12 分钟前
C++ 分支结构:if-else 与 switch-case 的用法与区别
开发语言·c++·学习·算法·switch·知识·分支
txzrxz14 分钟前
数据结构有关的题目(栈,队列,set和map)
数据结构·c++·笔记·算法··队列
CoderCodingNo25 分钟前
【GESP】C++五级练习题(前缀和) luogu-P1114 “非常男女”计划
数据结构·c++·算法
知乎的哥廷根数学学派27 分钟前
基于卷积特征提取和液态神经网络的航空发动机剩余使用寿命预测算法(python)
人工智能·pytorch·python·深度学习·神经网络·算法
我是大咖28 分钟前
关于柔性数组的理解
数据结构·算法·柔性数组
rannn_11136 分钟前
【Javaweb学习|Day6】日志技术、多表查询、分页查询及优化(动态SQL)
java·后端·javaweb
叫我:松哥1 小时前
基于神经网络算法的多模态内容分析系统,采用Flask + Bootstrap + ECharts + LSTM-CNN + 注意力机制
前端·神经网络·算法·机器学习·flask·bootstrap·echarts
每天学一点儿1 小时前
【医学图像处理】SimpleITK 图像配准全流程解析
算法