题解 | 链表内指定区间反转 特殊情况很多,边界值麻烦,虚拟头节点,过程繁琐。
链表内指定区间反转
https://www.nowcoder.com/practice/b58434e200a648c589ca2063f1faf58c
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) {
// write code here
//特殊情况
if (m == n) return head;
//虚拟头节点,用来应对边界情况
ListNode myNode = new ListNode(-1);
myNode.next = head;
ListNode left = null;
ListNode right = null;
ListNode left_last = null;
//寻找区间链表
int i = 0;
ListNode temp = myNode;
while (temp != null) {
if (i == m-1) {
left_last = temp;
}
if (i == n) {
right = temp;
break;
}
temp = temp.next;
i++;
}
//备份头尾节点
ListNode right_next = right.next;
left = left_last.next;
//切断联系
right.next=null;
left_last.next=null;
//反转链表
ListNode last = null;
ListNode cur = left;
while (cur!=null) {
temp = cur.next;
cur.next = last;
last = cur;
cur = temp;
}
//接回链表:
left.next = right_next;
left_last.next = right;
return myNode.next;
}
}
海康威视公司福利 1382人发布
