解題思路
先移動節點到要反轉的地方,反轉鏈表就比較簡單了,然後把當前節點和反轉的鏈表以及後面的第一個節點的串起來即可
代碼
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode reverseBetween(ListNode head, int m, int n) {
ListNode ans = new ListNode(0);
ans.next = head;
// 開始移動node
ListNode node = ans;
for(int i = 1;i < m;i++){
node = node.next;
}
//反轉開始結點
ListNode newHead = node.next;
ListNode preNode = null;
ListNode nextNode = null;
for(int i = 0;i < n - m + 1;i++){
nextNode = newHead.next;
newHead.next = preNode;
preNode = newHead;
newHead = nextNode;
}
//反轉完畢,nextNode就是反轉部分的後一個
//這兩步不能反過來
node.next.next = nextNode;
// preNode就是反轉完成後的頭節點
node.next = preNode;
return ans.next;
}
}