【问题标题】:What am I doing wrong in reversing part of this linked list?我在反转这个链表的一部分时做错了什么?
【发布时间】:2015-08-22 00:49:08
【问题描述】:

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

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;   
}

当我运行它无限期运行的程序时,在尝试调试时,我注意到它按预期运行,直到反转完成并且调试器似乎在标记的行处崩溃。

任何关于我做错了什么的想法将不胜感激。

【问题讨论】:

    标签: java algorithm linked-list


    【解决方案1】:

    正如您所说,反转有效,但最终的重新连接失败了。

    假设以下列表:[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 & 在startRev 的第三个元素中。 IE。都指向完全相同的节点

    所以,在执行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...
    

    这就是调试器崩溃的原因。您只需将startRev 重新附加到节点4 而不是5。所以,除了tmp,还有一个prevTmp

    另请注意,其余元素 (8,9,10) 会丢失或与主列表断开连接。因此,要重新连接它们,您需要节点 5 的引用并将其附加到其 nexttmp 在这里会派上用场。

    希望我能正确解释你哪里出错了。

    【讨论】:

    • 为什么 temp 是 5,null 而不是 5,6,7,8,9,10,null
    • 5 是第一个通过 while 循环的元素。 startRev.next=prev; 使 5.next=null,因为 prev 最初是 null。再一次,startRev 的值反映在tmp,所以tmp = 5,null;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-27
    • 1970-01-01
    相关资源
    最近更新 更多