Reverse Linked List II
- leetcode: Reverse Linked List II | LeetCode OJ
- lintcode:
Example
Given 1->2->3->4->5->NULL, m = 2 and n = 4, return
1->4->3->2->5->NULL.
Note
Challenge
Reverse it in-place and in one-pass
题解
- 由于只翻转指定区域,分析受影响的区域为第m-1个和第n+1个节点
- 找到第m个节点,使用for循环n-m次,使用上题中的链表翻转方法
- 处理第m-1个和第n+1个节点
- 返回dummy->next
* Definition for ListNode
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* next = null;
* }
* }
*/
public class Solution {
/**
* @param ListNode head is the head of the linked list
* @oaram m and n
*/
public ListNode reverseBetween(ListNode head, int m , int n) {
ListNode dummy = new ListNode(0);
dummy.next = head;
// find the mth node
ListNode premNode = dummy;
for (int i = 1; i < m; i++) {
premNode = premNode.next;
}
// reverse node between m and n
while (curr != null && (m <= n)) {
curr.next = prev;
prev = curr;
curr = nextNode;
m++;
}
// join head and tail before m and after n
premNode.next.next = curr;
premNode.next = prev;
return dummy.next;
}
}
- 处理异常
- 使用dummy辅助节点
- 找到premNode——m节点之前的一个节点
- 以nNode和postnNode进行遍历翻转,注意考虑在遍历到n之前postnNode可能为空
- 连接premNode和nNode,
premNode->next = nNode;
- 连接mNode和postnNode,
务必注意node 和node->next的区别!!,node指代节点,而node->next
指代节点的下一连接。