反向列表而不删除初始列表

时间:2017-02-08 17:35:46

标签: java algorithm data-structures linked-list nodes

我试图反转列表,但我想保留我的初始列表。我的函数reverse不会保留初始列表

例如,我想扭转这一点:

curl -s checkip.dyndns.org | sed -e 's/.*Current IP Address: //' -e 's/<.*$//'

我的功能是:

Node n = new Node(1,new Node(12, new Node(34, new Node(3, Node.NIL))));

反向后我的旧列表的长度是1,我希望它在这个例子中为4。我的旧名单和新名单在反向后必须具有相同的长度。

2 个答案:

答案 0 :(得分:2)

为了保留原始列表,您的reverse方法必须创建新的Nodes个对象,而不是对现有对象进行修改。

如果您想编写一个不带参数的递归reverse(),您可以按如下方式进行:

  • 制作新的Node,并将此节点的内容复制到其中;将next设置为NIL
  • 如果此节点的下一个节点为NIL,则返回上一步的结果
  • 否则,请在下一个
  • 上致电reverse()
  • 从上一个电话中获取返回值,然后导航至其结尾
  • 将新节点从第一步添加到结尾,然后返回结果。

更好的方法是更改​​reverse的签名,以相反的顺序获取到目前为止创建的节点。这将产生O(n)算法,而上面未修改的算法是O(n 2 )。

答案 1 :(得分:0)

这是一个基于dasblinkenlight的递归实现(喜欢句柄!)建议:&#34;更好的方法是改变反向签名,以相反的顺序取出目前创建的节点&#34 ;

public class Node {
    private static final Node NIL=null; 

    public Node(int data, Node next) {
        super();
        this.data = data;
        this.next = next;
    }

    public int getData() {
        return data;
    }

    public Node getNext() {
        return next;
    }

    private int data;

    private Node next;

    public String toString()
    {
        String s = "";
        Node cur = this;
        while (cur != Node.NIL) {
            s += cur.data + ",";
            cur = cur.getNext();
        }
        return s;
    }

    /* Where the recursive magic happens */
    /* build the reversed list in the parameter 'reversed' */
    public Node reverse(Node n, Node reversed) 
    {
        if (n == Node.NIL) {
            return reversed;
        } else {
            return reverse(n.next,new Node(n.data,reversed));
        }
    }

    /* Kick off the recursion from the head node */
    public Node reverseList() {
        return reverse(this,Node.NIL);
    }

    public static void main (String args[]) {

        // Create a sample list
        Node n = new Node(1,new Node(12, new Node(34, new Node(3, Node.NIL))));

        System.out.println(n);
        System.out.println(n.reverseList());
    }

}