2017-10-21 53 views
0

我必須編寫一個重複的函數來複制鏈表的每個元素並返回一個鏈表,如果L = [2,3,4],則重複(L)= [2,2,3,3,4 ,4]。我必須遞歸地做這件事。我意識到下面不是正確的解決方案,但我感到困惑。 =(如何在Java中遞歸地複製鏈表的每個元素?

public class MyList { 
    int value; 
    MyList next; 

    public static MyList duplicate(MyList L){ 
     if(L.next == null){ 
      L.next.value = L.value; 
      L.next.next = null; 
     } else { 
      MyList temp = L.next; 
      L.next.value = L.value; 
      L.next.next = temp; 
      duplicate(L.next); 
     } 
     return L; 
    } 
} 
+0

爲什麼你的方法不起作用?它對你的示例輸入有什麼作用?請不要假設我們運行您的代碼,並花幾個小時爲您查找錯誤。請幫助我們,提供儘可能多的信息。一般的過程應該是遞歸地遍歷整個列表,然後爲每個元素在當前元素之後插入相同的元素。這兩個部分應該相對容易實施。首先你應該實現一個工作** insert **方法。另外,爲什麼你的MyList類型的列表元素?你不應該有兩個類'List'和'Element'? – Zabuza

+0

如果你繼續添加項目到列表中,你永遠不會走到最後。因此,從列表的末尾回到開始。所以我會創建一個雙鏈接列表並添加MyList。 – jdweng

+0

看看我對此完全陌生,並沒有很多練習遞歸或Java,你不必粗魯。很高興你很容易實現。我問了這個問題,所以有人可以向我解釋如何實現它。 – Laura

回答

0

首先,檢查L不是空列表(null)。如果它包含一個值,返回具有重複兩次該值,然後通過複製列表的其餘部分的新列表。

通過給MyList構造,這是更具可讀性。

public class MyList { 
    int value; 
    MyList next; 

    public MyList(int value, MyList next) { 
     this.value = value; 
     this.next = next; 
    } 

    public static MyList duplicate(MyList list) { 
     if (list == null) { 
      return null; 
     } else { 
      return new MyList(list.value, 
        new MyList(list.value, 
         duplicate(list.next))); 
     } 
    } 
} 
0

您目前添加項目,然後呼叫遞歸,結束於不斷添加項目

您可能需要在要素背後你遞歸的正向加工時,或遞歸後向後處理時。


讓我們創建一個向後的方向版本。我們首先遞歸地走到列表的末尾,然後向後解決遞歸,每次在之後添加項目

public <E> void duplicateEntries(MyLinkedList<E> list) { 
    // Do nothing if list is empty 
    if (list.size() != 0) { 
     // Call the recursive method on the head node 
     duplicateEntriesHelper(list.head); 
    } 
} 

public <E> void duplicateEntriesHelper(Node<E> node) { 
    // Walk to the end of the list 
    if (node.next != null) { 
     duplicateEntriesHelper(node.next); 
    } 

    // Resolve recursion, duplicate current 
    // entry by inserting it after the current element 
    Node<E> duplicatedEntry = new Node<>(); 
    duplicatedEntry.data = node.data; 

    // Insert element after current node 
    duplicatedEntry.next = node.next; 
    node.next = duplicatedEntry; 
} 

的類我以前應該類似於:

public class MyLinkedList<E> { 
    public Node<E> head = null; 

    @Override 
    public String toString() { 
     // Build something like "MyLinkedList[2, 3, 4]" 
     StringBuilder sb = new StringBuilder(); 
     sb.append("MyLinkedList["); 

     StringJoiner sj = new StringJoiner(","); 
     Node<E> node = head; 
     while (node != null) { 
      sj.add(node); 
      node = node.next; 
     } 
     sb.append(sj); 

     sb.append("]"); 
     return sb.toString(); 
    } 
} 

public class Node<E> { 
    public Node next = null; 
    public E data = null; 

    @Override 
    public String toString() { 
     return E; 
    } 
} 

這裏是演示:

public static void main(String[] args) { 
    // Setup the list 
    MyLinkedList<Integer> list = new MyLinkedList<>(); 

    Node<Integer> first = new Node<>(); 
    first.data = 2; 
    Node<Integer> second = new Node<>(); 
    second.data = 3; 
    Node<Integer> third = new Node<>(); 
    third.data = 4; 

    list.head = data; 
    first.next = second; 
    second.next = third; 

    // Demonstrate the method 
    System.out.println("Before: " + list); 
    duplicateEntries(list); 
    System.out.println("After: " + list); 
} 

當然,你可以添加額外的方法和功能,它們。例如使用一些構造函數getter/setter方法。

相關問題