我试图反转列表,但我想保留我的初始列表。我的函数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。我的旧名单和新名单在反向后必须具有相同的长度。
答案 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());
}
}