思路:添加头节点,反转链表某个连续部分,是本题的特殊情况,也可以像本题一样做,具体见。
1 /** 2 * Definition for singly-linked list. 3 * public class ListNode { 4 * int val; 5 * ListNode next; 6 * ListNode(int x) { val = x; } 7 * } 8 */ 9 class Solution {10 public ListNode reverseBetween(ListNode head, int m, int n) {11 if(head == null) return head;12 ListNode dummy = new ListNode(0);13 dummy.next = head;14 ListNode pre = dummy;15 for(int i = 0; i < m - 1; i++) pre = pre.next;//移动m-1次16 ListNode start = pre.next;17 ListNode then = start.next;18 for(int i = 0; i < n - m; i++) { //需要将start后面的n-m个点陆续反转19 start.next = then.next;//start的后面指向then的后面20 then.next = pre.next;//then的后面指向pre的后面,相当于将then插入pre和pre.next之间21 pre.next = then;//pre的后面是then22 then = start.next;//完成一个元素的反转后,then指向下一个准备被反转(插入pre和pre.next之间)的节点23 }24 return dummy.next;25 }26 }
Next challenges: