翻转链表II

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

 

 

 

分享一下思路:定义一个虚节点dummy,后续节点指向head节点,获取left之前的节点为p和left节点为m和left之后的节点为n,将m和n节点两两交换,然后交换right - left次,然后把p的net的next指向n节点,换句话说是p节点的后续节点是原先left节点,然后把它的next指向原先right节点的后续节点,把p的next节点指向m节点。

 

/**
 * 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) {
        ListNode dummy = new ListNode(-1);
        dummy.next = head;
        ListNode p = dummy;
        for (int i = 0; i < left - 1; i++) {
            p = p.next;
        }
        ListNode m = p.next;
        ListNode n = m.next;
        for (int i = 0; i < right - left; i++) {
            ListNode temp = n.next;
            n.next = m;
            m = n;
            n = temp;
        }
        p.next.next = n;
        p.next = m;
        return dummy.next;
    }
    
}

 

posted @ 2022-03-15 12:35  牵魂  阅读(35)  评论(0)    收藏  举报