0

リンク リスト プログラムに問題があります。各ノード n の値を、リストの末尾にある値の合計で破壊的に置き換えるメソッドを書きたいと思います。したがって、リストが 2,3,5,7 の場合。17,15,12,7に変更したいです。これを行うメソッドを追加する必要があるプログラムが与えられました。最初の数字は変えられるのですが、他の3つは変えられず、行き詰ってしまいました。誰かが私を助けることができれば、それは素晴らしいことです.

オリジナルプログラム

public class IntList {
private int value;     
private IntList next;


public IntList(int v, IntList n) {          // Constructor
    value = v;
    next = n;
  }

public int getValue() { return value; }       // Getters
public IntList getNext() { return next; }
public void setValue(int v) { value = v; }    // Setters
public void setNext(IntList n) { next = n; }

// Find the last node of a linked list.
public IntList findLast() {
   if (getNext() == null) return this;
   else return getNext().findLast();
 }

// Add a new node with value v at the end of l;

public void addEnd(int v) {
    findLast().setNext(new IntList(v,null));
  }

// Add up the values in a list, recurring down the owner
public int sumList() {
   if (getNext() == null) return getValue();
   else return getValue() + getNext().sumList();
  }


// Convert list of int to string

// Recursive method for constructing the end of the string, after the
// initial open bracket.

 public String toString1() {
   if (getNext() == null)
      return getValue() + "]";
   else return getValue() + ", " + getNext().toString1();
 }

// Top level rountine that starts with the "[" and then calls toString1 to
// do the rest.

  public String toString() {
    return "[" + toString1();
  }

// Recursive method for finding the sum of a list, using recursion down
// an argument. Note that this is a static method, associated with the class
// not with an object owner.

 static public int sumListArg(IntList l) {
    if (l==null) return 0;
    else return l.getValue() + sumListArg(l.getNext());
   }

 static public void main(String[] args) {
   IntList l = new IntList(2,null);
   l.addEnd(3);
   l.addEnd(5);
   l.addEnd(7);
   System.out.println("h");
   System.out.println(l.toString());
   System.out.println("Sum = " + l.sumList());
} // end main
} // end RecursiveIntList    

これまでのところ、私の方法については次のとおりです(論理的には問題ないと思いますが、正しくありません)。

 public static void runningSum(IntList l)
{ 
     l.setValue(l.sumList());

    while(l.getNext() != null) 
     {
        l.setNext(l.getNext()); //Set Next to be the next reference
        l.getValue();  //Get the Next's value
        l.setValue(l.sumList()); //Add the rest of the numbers together
     }

     if(l.getNext() == null)
     {
         l.setValue(l.getValue());
     }

     System.out.println(l.toString());
}
4

3 に答える 3

2

素敵でエレガントな解決策があります:

public int sumList() {
    if (getNext() == null) {
        return getValue();
    }
    value = getValue() + getNext().sumList();
    return value;
 }

このメソッドでは、リストを再帰的に反復し、現在の要素の背後にあるすべての要素を要約し、同時に値を設定します。

于 2013-02-11T00:02:56.820 に答える
1

これはコードです:

public static void runningSum(IntList l)
{ 
    IntList head = l;
    int rSum = l.sumList();

    while(l != null) 
    {
        int curRS = rSum;
        curRS -= l.getValue();
        l.setValue(rSum);
        rSum = curRS;
        l = l.getNext();
    }

    System.out.println(head.toString());
}

何が起こっているのかを説明するために、いくつかの部分に分割します。リストの先頭を取り、説明した方法でリストを変更するプロシージャをコーディングしたいと考えています。基本的に、最初の要素はすべての元の要素の合計になる必要があります。2 番目の要素は、最初の要素を除くすべての要素の合計でなければなりません。最後の要素である末尾は、変更されないままにする必要があります。

public static void runningSum(IntList l)
{

関数に渡されたヘッドを覚えておく必要がある関数。lをheadという変数に保存します。

    IntList head = l;

最初の要素の現在の合計は、すべての要素の合計です。そのため、 sumListを呼び出し、結果をrSumという変数に格納します。

    int rSum = l.sumList();

これは、データ構造プログラミングの非常に典型的なイディオムです。要素が null でない間は、ループします。

    while(l != null) 
    {

次の要素の実行中の合計は、rSumから現在の要素の値を引いたものです。

        int nextRS = rSum - l.getValue();

これで、現在の要素の実行中の合計をrSumに設定できます。

        l.setValue(rSum);

次の反復では、現在の実行中の合計はnextRSです。最後に、次の要素を指すようにlを更新します。

        rSum = nextRS;
        l = l.getNext();
    }

headを追跡しなければ、何を印刷すればよいかわかりません。

    System.out.println(head.toString());
}
于 2013-02-11T00:01:49.567 に答える
1

リンクされたリストは、再帰に役立ちます。再帰的なソリューションは次のようになります。

public static void runningSum(IntList l) {
    if (l.getNext() != null) {
        runningSum(l.getNext());
        l.setValue(l.getValue() + l.getNext().getValue());
    }
}
于 2013-02-11T00:13:38.293 に答える