我正在尝试使用以下方法反转链表的一部分。
public void reversePart(int start, int end){
if(start > end || end >size || start <0)
throw new IllegalArgumentException("Invalid indices provided!");
int count = end-start;
LinkedListNode<Integer> tmp = head;
LinkedListNode<Integer> reversalEnd = head;
//skip start nodes;
while(start>0){
tmp=tmp.next;
start--;
}
//point where we need to reconnect the list.
while(end>0){
end--;
reversalEnd=reversalEnd.next;//prepare reversal end node to connect to reversalEnd .
}
reversalEnd= reversalEnd.next;
LinkedListNode<Integer> startRev= tmp;
LinkedListNode<Integer> prev= null;
LinkedListNode<Integer> nxt= null;
//reverseSubList
while(count>0){
count--;
nxt= startRev.next;
startRev.next=prev;
prev = startRev;
if(count ==0)
break;
startRev=nxt;
}
tmp.next=startRev;// debugger crashes here.
nxt.next=reversalEnd;
}
当我运行程序时,它会无限期运行,在尝试调试时,我注意到它会按预期运行,直到反转完成,调试器似乎在标记的行处崩溃。
如果你对我做错了什么有任何想法,我将不胜感激。
正如您所说,反转是有效的,但最终的重附着失败了。
假设以下列表:[1,2,3,4,5,6,7,8,9,10]
。当您到达tmp.next=startRev;
时,变量如下所示:
tmp = 5,null;
reversalEnd = 9,10,null;
startRev = 7,6,5,null;
prev = 7,6,5,null;
nxt = 8,9,10,null;
null
表示不存在next
。
这里需要注意的重要点是,保持值5
的node
由几个变量引用,特别是tmp
&在CCD_ 8的第三元素中。即两者都指向完全相同的节点。
因此,在执行tmp.next=startRev;
时,5
现在将指向下一个7
。7
指向6
,6
指向5
,从一开始就是相同的5
。所以,你在那里给自己做了一个循环。
5,7,6,5,7,6,5,7,6,5,7,6,5,7,6,5,7,6,5,7,6,5,7,6,5,7,6,5,7,6,5,7,6,5...
因此调试器崩溃。您只需要在节点4
而不是5
处重新附加startRev
。因此,除了tmp
,还有一个prevTmp
。
还要注意,剩余元素(8,9,10
(丢失或与主列表断开连接。因此,要重新连接它们,需要引用节点5
&将其附加到其CCD_ 24。tmp
在这里会派上用场。
希望我能正确地解释你哪里出了问题。