题解 | 链表内指定区间反转
链表内指定区间反转
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; } // 计算链表的长度 if (lengthOfListNode(head) == 1) { return head; } if (lengthOfListNode(head) == 2) { return reverseList(head); } // 先找出要反转的链表m的前一个节点 ListNode preM = null; ListNode mNode = null; if (preMListNode(head, m) != null) { preM = preMListNode(head, m); mNode = preM.next; } else { //说明m=1 mNode = head; } ListNode aftN = null; ListNode nNode = null; if (nNode(head, n) != null) { nNode = nNode(head, n); aftN = nNode.next; } if (preM != null) { preM.next = null; } if (nNode != null) { nNode.next = null; } ListNode listNode = reverseList(mNode); if(preM!=null){ preM.next = listNode; } mNode.next = aftN; if(m==1){ return listNode; } return head; } public ListNode preMListNode (ListNode head, int m) { int i = 1; ListNode preM = null; while (head != null) { if (i == (m - 1)) { preM = head; break; } head = head.next; i++; } return preM; } public ListNode nNode (ListNode head, int n) { int i = 1; ListNode nNode = null; while (head != null) { if (i == n) { nNode = head; break; } head = head.next; i++; } return nNode; } public ListNode reverseList (ListNode head) { // write code here ListNode cur = null; ListNode pre = head; while (pre != null) { ListNode next = pre.next; pre.next = cur; cur = pre; pre = next; } return cur; } public int lengthOfListNode(ListNode head) { int length = 0; while (head != null) { length++; head = head.next; } return length; } }