翻转链表2

此博客链接:

翻转链表2

题目链接:https://leetcode-cn.com/problems/reverse-linked-list-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]

题解

我一开始想着把链表分为3部分,第一部分是开头不需要翻转的链表,第二部分是需要翻转的部分,把需要翻转的部分使用头插法翻转链表,第三部分是不需要翻转的部分,然后把三部分最后链接在一起,但是当最后一部分链接时,是没有办法链接的,因为中间部分经过头插法翻转链表后,指针是一直指向最前面,不会在指向最后,所以没有办法和第三部分链接。

后来看了题解,原来使用头插法是没有问题的,只是不需要把链表分为三个部分,而是在不需要翻转的部分使用头插法,每次都是把需要翻转的插到第一个需要翻转的元素后面。

代码

class Solution {
    public ListNode reverseBetween(ListNode head, int left, int right) {
        ListNode p=head;
        ListNode q=head;
        while(q!=null){
             if(q.next.val==left)
            {
                p=q;
                q=q.next;
                break;
            }
        }
        while(p.next.val!=right)
        {
            ListNode t=q.next;
            p.next=t;
            q.next=t.next;
            t.next=q;
            // System.out.println(head);
        }
        return head;
    }
}

结果

但是吧,奈何我的程序还是结果不对。

出来混总是要还的
原文地址:https://www.cnblogs.com/ping2yingshi/p/14813009.html