2012-03-14 50 views
4

我需要制作一个方法,使用递归移除LinkedList的最后一个元素。 这是我迄今为止,但它似乎并没有删除节点...当我调用list.size()它仍然是相同的大小相同的值。我在这里做错了什么? 这是Java的方式尝试使用递归创建removeLastElement

public void removeLastElement(Node curr){ 
     if (curr == null) 
      return; 
     else{ 
      if(curr.next == null) 
       curr = null; 
      else 
       removeLastElement(curr.next); 
     } 

    } 
+0

你给节点参数的方法,所以它意味着你一定知道它是最后一个元素,那么为什么你使用一种方法和更有趣的“递归”来删除最后一个元素althoguh你已经知道哪个是你列表中的最后一个元素? – Juvanis 2012-03-14 05:08:39

+0

我认为你必须先遍历节点......像'curr = curr.next'之类的东西,然后将removeLastElement(curr );' – 2012-03-14 05:12:05

+0

我的家庭作业要求我们使用递归。我想我们不应该使用节点参数呢?从你的回答中判断。 – user1267952 2012-03-14 05:13:17

回答

1

在一个LinkedList删除你必须得到倒数第二个元素的最后一个元素,并设置

curr.next = null 
+0

我会如何写?我是链接列表和递归的新手。对不起:( – user1267952 2012-03-14 05:16:02

+0

@Ruuhkis在名称前加上“@”,以便人们可以在他们的收件箱中收到评论:) – 2012-03-14 06:43:01

1

你以正确的方式来获得删除最后一个节点的循环函数。问题是你正在用curr.next == null来识别倒数第二个节点,如果你知道了,你将它取消,但那是你的实际输入!所以,你必须检查实际的节点是倒数第三节点列表上:

if (curr.next.next == null) { 
    curr.next = null; //Now you're modifying the data in your input. 
} 

随着这一变化,有更多的基本情况进行检查,但是这是你的,我的朋友。

+0

antepenultimate:我认为你的意思是第三名? – mikek3332002 2012-03-23 02:06:35

+0

@ mikek3332002是的这就是我的意思 – 2012-03-23 02:20:13

0
Boolean deleteLast(Node n) 
{ 
    if(n.next == null) 
     return true; 

    if(deleteLast(n.next)) 
    { 
     n.next = null; 
     return false; 
    } 

    return false; 
} 
0
Node deleteLast(Node n) { 
    if (n.next == null) 
    return null; 
    n.next = deleteLast(n.next); 
    return this; 
} 

的总体思路是你问下一个节点“哎,你能告诉我你在哪里,并删除您的最后一个节点?”然后最后一个节点可以说“我无处可去”,它将全部落实到位。

这与Aadi的答案非常相似,只是使用Node而不是boolean s。