2012-03-14 54 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。