以递归方式从链表中删除节点

时间:2016-03-31 00:08:54

标签: java recursion linked-list

给定链表的头部和搜索作为参数的int,我需要一个方法来删除列表中第一次出现的这个数字,并返回修改后的列表。但是我无法修改原始列表。我知道如何从列表中删除节点,但我不知道如何保持原始列表完整,因为这必须递归完成。以下是方法 **最初M是原始列表。我不知道在再次调用该方法后它仍然是相同的列表...?

MyList removeNumber(MyList m, int removee){

3 个答案:

答案 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。即第一个列表没有变化。