我在使用链表程序时遇到困难。我想写一个方法,用列表尾部的值之和破坏性地替换每个节点n中的值。因此,如果列表是2,3,5,7;我想将其更改为17,15,12,7。给我一个程序,在其中我必须添加执行此操作的方法。我可以更改第一个数字,但是我不能更改其他三个数字,并且我被卡住了。如果有人可以帮助我,那就太好了。

原始程序

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());
}

最佳答案

这是代码:

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());
}


我将其分为几个部分来解释发生了什么。我们要编写一个程序,该程序采用列表的开头并按照您描述的方式更改列表;基本上,第一个元素必须成为所有原始元素的总和;第二个元素必须是第一个元素之外的所有元素的总和,依此类推。最后一个元素,即尾部,必须保持不变。

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();
    }


如果我们不了解情况,那么现在我们将不知道要打印什么。

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

07-27 20:26