BaseCode:
class Solution {
public ListNode reverseBetween(ListNode head, int left, int right) {
if (head == null || left == right) {
return head;
}
ListNode cur = head;
ListNode newHead = new ListNode(0); // 返回的结果节点头
int index = 1;
while (cur != null) {
if (index == left) { // 到左节点了
Stack<ListNode> stack = new Stack<>();
while (index != right) {
stack.add(cur);
cur = cur.next;
index = index + 1;
}
// 到右节点了
stack.add(cur);
while (!stack.empty()) {
newHead.next = stack.pop();
newHead = newHead.next;
}
newHead.next = null;
cur = cur.next;
index = index + 1;
}
newHead.next = cur;
cur = cur.next;
newHead = newHead.next;
index = index + 1;
}
return newHead.next;
}
}
AccessCode:
class Solution {
public ListNode reverseBetween(ListNode head, int left, int right) {
if (head == null || left == right) {
return head;
}
ListNode cur = head;
ListNode newHead = new ListNode(0); // 返回的结果节点头
ListNode newCur = newHead;
int index = 1;
while (cur != null) {
if (index == left) { // 到左节点了
Stack<ListNode> stack = new Stack<>();
while (index != right) {
stack.add(cur);
cur = cur.next;
index = index + 1;
}
// 到右节点了
stack.add(cur);
cur = cur.next;
while (!stack.empty()) {
newCur.next = stack.pop();
newCur = newCur.next;
}
newCur.next = cur;
return newHead.next;
}
newCur.next = cur;
newCur = newCur.next;
cur = cur.next;
index = index + 1;
}
return newHead.next;
}
}
错误原因:
当堆栈清空后,只要newCur再连接原链表右节点的后续节点即可返回,if(cur.val == left) 外的代码段只是当没有走到原链表左节点会执行;而BaseCode在循环中,堆栈清空后没有及时做连接和返回,导致内存溢出,出现死循环。