题解 | 链表内指定区间反转

反转链表

https://www.nowcoder.com/practice/75e878df47f24fdc9dc3e400ec6058ca?tpId=295&tqId=23286&sourceUrl=%2Fexam%2Foj%3FquestionJobId%3D10%26subTabName%3Donline_coding_page

import java.util.*;

/*
 * public class ListNode {
 *   int val;
 *   ListNode next = null;
 *   public ListNode(int val) {
 *     this.val = val;
 *   }
 * }
 */

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param head ListNode类 
     * @param m int整型 
     * @param n int整型 
     * @return ListNode类
     */
    public ListNode reverseBetween (ListNode head, int m, int n) {
        ListNode dummyHead = new ListNode(0);
        dummyHead.next = head;
        //创建虚拟节点

        ListNode pre =dummyHead;
        pre = dummyHead;
        //创建一个节点代表需要翻转的前驱点

        for(int i = 0 ; i < m-1 ; i++){
           pre = pre.next;
        }
        //找到翻转的前一个点

        ListNode cur = pre.next;
        ListNode curN = null;
        //初始化cur指针

        for(int i = 0 ; i < n-m ; i++){
            curN = cur.next;
            cur.next = curN.next;
            curN.next = pre.next;
            pre.next = curN; 
        }
        return dummyHead.next;
    }
}

单链表部分翻转的优雅解法:头插法详解

问题描述:给定一个单链表和两个整数 mn1 ≤ m ≤ n ≤ 链表长度),要求反转链表中从第 m 个到第 n 个节点的子链表,其余部分保持原样。

这是头插法的具体实现

初始状态(反转第2到第4个节点)

第一次循环(处理节点3):

第二次循环(处理节点4):

可视化过程:

注意:创建一个虚拟的头节点,让真正的头节点 head 也有一个前驱节点。这样无论要反转的部分是否包含头节点,处理逻辑都能保持统一,避免了复杂的边界判断!!!

全部评论

相关推荐

评论
2
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务