92. 反转链表 II-字节跳动高频题

Posted hequnwang10

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了92. 反转链表 II-字节跳动高频题相关的知识,希望对你有一定的参考价值。

一、题目描述

给你单链表的头指针 head 和两个整数 left 和 right ,其中 left <= right 。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表 。

示例 1:

输入:head = [1,2,3,4,5], left = 2, right = 4
输出:[1,4,3,2,5]
示例 2:
输入:head = [5], left = 1, right = 1
输出:[5]

二、解题

链表拆分+合并


先找到上面四个节点值,然后preleft和leftnode断开,然后在将rightnode和nextright断开,然后将leftnode和rightnode中的链表翻转,然后在合并链表。

/**
 * 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) 
        //定义两个节点,left 的前一个节点,right的后一个节点
        ListNode dummy = new ListNode(-1);
        dummy.next = head;
        ListNode prelfet = dummy;
        //查找四个节点
        for(int i = 0;i<left-1;i++)
            prelfet = prelfet.next;
        
        ListNode leftnode = prelfet.next;

        ListNode rightnode = prelfet;
        for(int i = 0;i<right-left+1;i++)
            rightnode = rightnode.next;
        
    
        ListNode nextright = rightnode.next;
        //断开链表
        prelfet.next = null;
        rightnode.next = null;
        //翻转链表
        ListNode cur = reverse(leftnode);
        //合并链表
        prelfet.next = cur;
        leftnode.next = nextright;
        return dummy.next;        
    
    //翻转链表有两种 递归和迭代
    public ListNode reverse(ListNode head)
        if(head == null || head.next == null)
            return head;
        
        ListNode cur = reverse(head.next);
        head.next.next = head;
        head.next = null;
        return cur;
    

以上是关于92. 反转链表 II-字节跳动高频题的主要内容,如果未能解决你的问题,请参考以下文章

排序奇升偶降链表-链表拆分反转归并-字节跳动高频题

字节跳动高频算法题TOP100

字节跳动高频算法题TOP100

字节跳动高频算法题TOP100

字节跳动一道力扣没有的高频面试题题——排序奇升偶降链表

字节跳动+百度+阿里巴巴高频面试题之链表专题