给定链表的头部和搜索作为参数的int,我需要一个方法来删除列表中第一次出现的这个数字,并返回修改后的列表。但是我无法修改原始列表。我知道如何从列表中删除节点,但我不知道如何保持原始列表完整,因为这必须递归完成。以下是方法 **最初M是原始列表。我不知道在再次调用该方法后它仍然是相同的列表...?
MyList removeNumber(MyList m, int removee){
答案 0 :(得分:0)
//This function will always return a new list with 'remove' removed
MyList removeNumber(MyList m, int remove){
//if m is empty List, return an empty list
//if head is not the int to remove, return a New list from
// head concat removeNumber(m.next,remove)
//else return removeNumber(m.next,remove)
}
答案 1 :(得分:0)
我认为它缺乏信息。我假设一个非常传统的链表实现,例如:
class MyList {
MyList prev;
MyList next;
int data;
static MyList removeNumber(MyList m,int removee) {
if(m == null) return null; // already empty
if(m.data == removee) { // m already is the node to throw away
if(m.prev != null)// relink
m.prev.next = m.next;
if(m.next != null)// relink
m.next.prev = m.prev;
return m.prev;
}
// if this node isn't the one yet, keep looking for
return removeNumber(m.next,removee);
}
}
有很多不同的方法可以做到这一点,但您必须提供更多信息才能让我们为您指出正确的文献。
答案 2 :(得分:0)
这个想法是得到的结构将是一个" Y":一个双头列表(实际上是一个简单的图表)。
Y的一个分支是原始列表。另一个是删除节点的新列表。 Y的垂直茎是你移除的元素之后的东西。这两个列表都很常见。这里有一些ascii艺术,Y在其侧面显示1到5的列表,其中3个被移除。
new -> 1 -> 2 ------\
v
original -> 1 -> 2 -> 3 -> 4 -> 5 -> null
递归思考就是根据自身的较小版本加上固定的工作量来定义问题。你需要一个基础案例(或者几个)。
链表本身就是一个递归结构:
列表是空的,或者是由" next"链接的元素。参考清单。
注意,这使用较小的列表定义列表。基本情况是空列表。固定位是元素。
阅读此定义几次,然后看看它如何翻译代码:
class MyList {
int value; // the element at the head of this list
MyList next; // the rest of the list
MyList(int value, MyList next) {
this.value = value;
this.next = next;
}
}
基本情况"空列表"只是null
参考。使用相同模式递归表示的元素移除问题变为:
删除了元素的列表的副本是a)在要删除的元素是head或b)当前节点的副本后跟副本的情况下,列表后面的其余列表列表的其余部分删除了所需的元素。
我在这里定义一个列表的副本,其中删除了一个元素"使用较小版本的同一件事。案例a)是基本案例。固定位是在不 removee
时复制头部。
当然还有另一个基本案例:如果列表为空,则无法找到removee
。这是一个错误。
将其放入代码:
MyList removeNumber(MyList m, int removee) {
if (m == null) throw new RuntimeException("removee not found");
if (m.value == removee) return m.next;
return new MyList(m.value, removeNumber(m.next, removee));
}
使用该功能看起来像这样:
MyList originalList = ... // list of 1 to 5.
MyList newListWith3removed = removeNumber(originalList, 3);
System.out.println("Original list:");
for (MyList p : originalList) System.out.println(p.value);
System.out.println("With 3 removed:");
for (MyList p : newListWith3removed) System.out.println(p.value);
输出将按预期显示:第一个列表中为1到5,第二个列表中为1,2,4,5。即第一个列表没有变化。