我在使用链接列表程序时遇到了困难。我想编写一个方法,通过列表尾部的值的总和破坏性地替换每个节点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());
}
答案 0 :(得分:2)
有一个很好的优雅解决方案:
public int sumList() {
if (getNext() == null) {
return getValue();
}
value = getValue() + getNext().sumList();
return value;
}
在此方法中,您递归遍历List,并汇总当前元素后面的所有元素,并同时设置值。
答案 1 :(得分: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());
}
我会在几个部分打破它来解释发生了什么。我们想要编写一个过程,该过程采用列表的头部并以您描述的方式更改列表;基本上第一个元素必须成为所有原始元素的总和;第二个元素必须是除第一个元素之外的所有元素的总和,依此类推。最后一个元素尾巴必须保持不变。
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());
}
答案 2 :(得分:1)
链接列表适合递归。递归解决方案可能如下所示:
public static void runningSum(IntList l) {
if (l.getNext() != null) {
runningSum(l.getNext());
l.setValue(l.getValue() + l.getNext().getValue());
}
}