我把这个链接列表的一部分颠倒过来,做错了什么



我正在尝试使用以下方法反转链表的一部分。

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

这里需要注意的重要点是,保持值5node由几个变量引用,特别是tmp&在CCD_ 8的第三元素中。即两者都指向完全相同的节点

因此,在执行tmp.next=startRev;时,5现在将指向下一个77指向66指向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在这里会派上用场。

希望我能正确地解释你哪里出了问题。

相关内容

  • 没有找到相关文章

最新更新