在扭转部分链表时我做错了什么?

时间:2015-08-22 00:49:09

标签: java algorithm linked-list

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

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 个答案:

答案 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;现在将指向57指向76指向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;的引用。将其附加到5next会在这里派上用场。

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