题解 | #链表内指定区间反转#
链表内指定区间反转
http://www.nowcoder.com/practice/b58434e200a648c589ca2063f1faf58c
import java.util.*; /* * public class ListNode { * int val; * ListNode next = null; * } */ 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 == 0) return head; int i = 1; ListNode l1 = new ListNode(0),l2 = new ListNode(0); ListNode p = head; while(head != null){ //记录开始反转的前一个节点 if(i == m - 1) l1 = head; if(i == n){ //记录反转结尾的下一个节点 l2 = head.next; break; } head = head.next; i++; } //开头反转,只需要连接反转结尾的节点 if(m == 1){ ListNode n1 = dfs(p,m,n); ListNode k = n1; while(n1.next != null){ n1 = n1.next; } //连接反转结尾的节点 n1.next= l2; return k; }else{ ListNode k = dfs(l1.next,m,n); //连接开始反转的节点 l1.next = k; while(k.next != null){ k = k.next; } //连接结尾反转的节点 k.next = l2; } return p; } //反转 public ListNode dfs(ListNode p ,int m,int n){ if(m == n){ return p; } ListNode p1 = dfs(p.next,m + 1,n); p.next.next = p; p.next = null; return p1; } }