题解 | 链表内指定区间反转
反转链表
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; } }
单链表部分翻转的优雅解法:头插法详解
问题描述:给定一个单链表和两个整数 m
, n
(1 ≤ m ≤ n ≤ 链表长度
),要求反转链表中从第 m
个到第 n
个节点的子链表,其余部分保持原样。
这是头插法的具体实现
初始状态(反转第2到第4个节点)
第一次循环(处理节点3):
第二次循环(处理节点4):
可视化过程:
注意:创建一个虚拟的头节点,让真正的头节点 head
也有一个前驱节点。这样无论要反转的部分是否包含头节点,处理逻辑都能保持统一,避免了复杂的边界判断!!!