题解 | #链表内指定区间反转#
链表内指定区间反转
https://www.nowcoder.com/practice/b58434e200a648c589ca2063f1faf58c?tpId=295&tags=&title=&difficulty=0&judgeStatus=0&rp=0&sourceUrl=%2Fexam%2Fintelligent%3FquestionJobId%3D10%26tagId%3D21000
import java.util.*;
class ListNode {
int val;
ListNode next;
public ListNode(int val) {
this.val = val;
}
public ListNode(ListNode next) {
this.next = next;
}
public ListNode(int val, ListNode next) {
this.val = val;
this.next = next;
}
@Override
public String toString() {
return "ListNode{" +
"val=" + val +
", next=" + next +
'}';
}
}
/*
* 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 static void main(String[] args) {
// ListNode r = new ListNode(1, new ListNode(2, new ListNode(3, new ListNode(4, new ListNode(5)))));
ListNode r = new ListNode(5, null);
Solution s = new Solution();
System.out.println("++++++++ result +++++++");
System.out.println(s.reverseBetween(r, 1, 1));
// 创建链表
}
public static ListNode findEndNode(ListNode h) {
if (h == null) {
return null;
}
while (h.next != null) {
h = h.next;
}
return h;
}
public ListNode reverseBetween(ListNode head, int m, int n) {
// write code here
ListNode result = head;
ListNode m_node = Solution.findIndexNode(head, m - 1);
ListNode n_node = Solution.findIndexNode(head, n + 1);
ListNode subListNode = Solution.subListNode(head, m, n);
ListNode reverseLiseNode = Solution.reverseListNode(subListNode);// 原地转
if (m_node == null) {
result = reverseLiseNode;
} else {
m_node.next = reverseLiseNode;
}
// 新链表
while (head.next != null) {
head = head.next;
}
head.next = n_node;
// return
return result;
}
public static ListNode findIndexNode(ListNode head, int n) {
if (head == null || n == 0) {
return null;
}
ListNode result = null;
int index = 0;
while (true) {
index++;
if (index < n) {
result = head;
head = head.next;
continue;
}
if (index == n) {
result = head;
break;
}
if (head == null) {
result = null;
break;
}
}
return result;
}
public static ListNode subListNode(ListNode head, int m, int n) {
if (head == null) {
return null;
}
// 至少一个节点
int index = 0;
ListNode sub = null;
while (true) {
// 记录到了第index个节点
index++;
// 未到头节点
if (index < m) {
head = head.next;
continue;
}
// 找到头节点
if (index == m) {
// 记录头节点
sub = head;
continue;
}
// 在区间里面
if (index > m && index <= n) {
// 移动指针
head = head.next;
continue;
}
// 找完了
if (head == null) {
break;
}
if (index > n) {
head.next = null;
break;
}
}
return sub;
}
public static ListNode reverseListNode(ListNode head) {
if (head.next == null) {
return head;
}
ListNode rest = reverseListNode(head.next);
head.next.next = head;
head.next = null;
return rest;
}
}
查看6道真题和解析