如何反转链接列表的实现顺序?

时间:2012-10-26 10:33:56

标签: java linked-list

我有一个名为LinkStrand的类,其功能与链接列表非常相似。它有toString()size()append()next()value(),但一个previous()方法。我试图编写反转节点顺序的代码,以及每个节点内的字符串。为了使我在其他一些我必须编写的方法中更容易,我摆脱了构造节点的下一个节点要求。这是Node类的样子:

private class Node {
    public Node myNext;
    public String myData;

    Node(String value) {
        myData = value;
        //myNext = next;
    }   
}

我的.reverse()方法当前单独反转节点内的所有字符串,但不会反转节点本身的顺序。它复制如下:

public IDnaStrand reverse() {
    if (this == null)
        return this;
    Node prevStrand = null;
    Node thisStrand = myHead;
    String revString;
    LinkStrand val = new LinkStrand();
    while (thisStrand != null){
        Node hold = thisStrand.myNext;
        if (revSave.containsKey(thisStrand.myData)){
            revString = revSave.get(thisStrand.myData);
            val.append(revString);
            //System.out.println("Val is: " + val);
        }
        else{
            revString = reverseStr(thisStrand.myData);
            val.append(revString);
            //System.out.println("Val is: " + val);
            revSave.put(thisStrand.myData, revString);
        }
        thisStrand.myData = revString;
        thisStrand.myNext = prevStrand;
        prevStrand = thisStrand;
        thisStrand = hold;
    }
    return val;
}

我一直试图想出某种方法来反转节点顺序,但我画了一个空白。有谁知道我怎么会这样做?

谢谢!

3 个答案:

答案 0 :(得分:2)

如果您允许修改IDnaStrandLinkStrand,请添加方法prepend(Node n)。然后,当您遍历列表时,只需预先添加每个节点。

如果您无法修改课程,请将Node反向顺序(nodeArray[size-1]nodeArray[size-2],...保存到数组中然后按顺序创建一个新的LinkStrand数组。或者,您可以按顺序加载数组,然后以反向顺序创建LinkStrand

示例:

thisStrand = myHead;
int size = 0;
while(thisStrand != null){
    thisStrand = thisStrand.myNext;
    size++;
}
Node[] nodeArray = new Node[size];
thisStrand = myHead;
for(int i = size-1, i < 0; i--) {
    nodeArray[i] = thisStrand;
}

现在您拥有了数组,只需将其加载到新列表中即可!当然,添加prepend方法会更好,只需让类做

newElement.myNext = MyHead;
MyHead = newElement;

答案 1 :(得分:1)

创建一个新实例 循环遍历原始并插入位置0的新实例,然后返回它。

其他方式是对其进行排序,但在您的问题中看不到任何表明它当前已排序的内容。

答案 2 :(得分:0)

假设您的列表如下所示:

A -> B -> C -> D -> E

我会缩短符号,因为我会写这么多:

A B C D E

让我们拿3个变量。我将展示他们的整个列表,以便您可以看到正在发生的事情。第一项始终是存储在其中一个变量

中的节点
list: null
curr: A B C D E
next: B C D E

将A的下一个指针设置为list(null)的值。它现在是列表的末尾。

list: null
curr: A
next: B C D E

现在,转到下一个:

list: A
curr: B C D E
next: C D E

你可以看到会发生什么。我们开始时继续:将curr的下一个指针设置为list

list: B A
curr: B A
next: C D E

高级:

list: B A
curr: C D E
next: D E

再次:

list: C B A
curr: C B A
next: D E

等等......

伪代码很简单:

list = null
curr = original_list

while next != null
    next = curr->next
    curr->next = list
    list = curr
    curr = next
end

所有这一切都是从列表的头部获取每个节点并使其成为另一个列表的头部。这具有扭转顺序的效果。我的答案可能有点啰嗦,但这就是你所做的一切。