我尝试使用以下方法反转部分链接列表。
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;
}
当我运行该程序时,它无限期地运行,在尝试调试时,我注意到它按预期运行直到反转完成并且调试器似乎在标记线处崩溃。
对于我做错了什么的任何想法都将不胜感激。
答案 0 :(得分:2)
正如你所说,逆转有效,但它最终的重新连接失败了。
假设以下列表:[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
。
重要要注意的是,保留值node
的{{1}}由多个变量引用,特别是5
&amp;在tmp
的第三个元素中。即两者都指向完全相同的节点。
因此,在执行startRev
时,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...
而不是startRev
重新附加4
即可。因此,与5
一起,也有tmp
。
另请注意,剩余元素(prevTmp
)会从主列表中丢失或断开连接。因此,要重新连接它们,您需要节点8,9,10
&amp;的引用。将其附加到5
。 next
会在这里派上用场。
希望我能够正确解释你哪里出错了。