解题思路:在指定范围内进行链表反转,只需在m-n范围内进行反转,然后连上m-1与n+1节点就可以。
代码如下:
class Solution {
public ListNode reverseBetween(ListNode head, int m, int n) {
ListNode dummy = new ListNode(0);
dummy.next = head;
ListNode preNode = dummy;
for(int i=1;i<m;i++)
preNode = preNode.next;
ListNode pre = null,cur = preNode.next;
while(cur!=null && m<=n){
ListNode next = cur.next;
cur.next = pre;
pre = cur;
cur = next;
m++;
}
preNode.next.next = cur;
preNode.next = pre;
return dummy.next;
}
}
源码分析
- 处理异常
- 使用dummy辅助节点
- 找到premNode——m节点之前的一个节点
- 以nNode和postnNode进行遍历翻转,注意考虑在遍历到n之前postnNode可能为空
- 连接premNode和nNode,
premNode->next = nNode;
- 连接mNode和postnNode,
mNode->next = postnNode;
务必注意node 和node->next的区别!!,node指代节点,而node->next
指代节点的下一连接。
参考:https://www.kancloud.cn/kancloud/data-structure-and-algorithm-notes/73012