Java 替换节点的链表

Java 替换节点的链表,java,linked-list,Java,Linked List,我在使用链表程序时遇到困难。我想写一个方法,用列表尾部的值之和,以破坏性的方式替换每个节点n中的值。如果列表是2,3,5,7;我想把它改成17,15,12,7。我得到了一个程序,我必须添加一个方法来实现这一点。我可以换第一个号码,但我不能换另外三个,我卡住了。如果有人能帮助我,那就太好了 原始程序 public class IntList { private int value; private IntList next; public IntList(int v, IntList

我在使用链表程序时遇到困难。我想写一个方法,用列表尾部的值之和,以破坏性的方式替换每个节点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)
{ 
    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;
    int rSum = l.sumList();
        l.setValue(rSum);
第一个元素的运行和是所有元素的和;因此我们调用sumList,并将结果存储在名为rSum的变量中

    IntList head = l;
    int rSum = l.sumList();
        l.setValue(rSum);
这是数据结构编程中非常典型的习惯用法;当元素不为null时,可以循环

    while(l != null) 
    {
下一个元素的运行和是rSum减去当前元素的值

        int nextRS = rSum - l.getValue();
        rSum = nextRS;
        l = l.getNext();
    }
现在我们可以将当前元素的运行和设置为rSum

    IntList head = l;
    int rSum = l.sumList();
        l.setValue(rSum);
对于下一次迭代,当前运行总和为nextRS。最后,我们更新l以指向下一个元素

        int nextRS = rSum - l.getValue();
        rSum = nextRS;
        l = l.getNext();
    }
如果我们没有跟踪头,现在我们就不知道打印什么了

    System.out.println(head.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;
    int rSum = l.sumList();
        l.setValue(rSum);
第一个元素的运行和是所有元素的和;因此我们调用sumList,并将结果存储在名为rSum的变量中

    IntList head = l;
    int rSum = l.sumList();
        l.setValue(rSum);
这是数据结构编程中非常典型的习惯用法;当元素不为null时,可以循环

    while(l != null) 
    {
下一个元素的运行和是rSum减去当前元素的值

        int nextRS = rSum - l.getValue();
        rSum = nextRS;
        l = l.getNext();
    }
现在我们可以将当前元素的运行和设置为rSum

    IntList head = l;
    int rSum = l.sumList();
        l.setValue(rSum);
对于下一次迭代,当前运行总和为nextRS。最后,我们更新l以指向下一个元素

        int nextRS = rSum - l.getValue();
        rSum = nextRS;
        l = l.getNext();
    }
如果我们没有跟踪头,现在我们就不知道打印什么了

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

有一个漂亮而优雅的解决方案:

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

在该方法中,您递归地遍历列表,并汇总当前元素后面的所有元素,同时设置值。

有一个很好且优雅的解决方案:

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

在该方法中,您递归地遍历列表,并汇总当前元素后面的所有元素,同时设置值。

链接列表适合递归。递归解决方案可能如下所示:

public static void runningSum(IntList l) {
    if (l.getNext() != null) {
        runningSum(l.getNext());
        l.setValue(l.getValue() + l.getNext().getValue());
    }
}

链表易于递归。递归解决方案可能如下所示:

public static void runningSum(IntList l) {
    if (l.getNext() != null) {
        runningSum(l.getNext());
        l.setValue(l.getValue() + l.getNext().getValue());
    }
}

我相信他不能真正改变数据结构。我不能将结构改变为双链接列表。不过谢谢你的帮助。递归解决方案怎么样?那是可行的,但它必须是一个迭代解决方案。谢谢你的帮助。我相信他不能真正改变数据结构。我不能将结构改变为双链接列表。不过谢谢你的帮助。递归解决方案怎么样?那是可行的,但它必须是一个迭代解决方案。谢谢你的帮助。哇!你能代替我的教授吗?哈哈。非常感谢你,我现在完全明白了。谢谢你,一开始我试着按照你的建议打电话给sumList。从教学上讲,我认为这是一个很好的例子,但代码大师的答案是最有效和紧凑的,它也有您相同的原型(void函数)。我最初倾向于像他那样做,但这是一个int函数,所以我放弃了它。如果你想接受他的回答,我可以接受。哇!你能代替我的教授吗?哈哈。非常感谢你,我现在完全明白了。谢谢你,一开始我试着按照你的建议打电话给sumList。从教学上讲,我认为这是一个很好的例子,但代码大师的答案是最有效和紧凑的,它也有您相同的原型(void函数)。我最初倾向于像他那样做,但这是一个int函数,所以我放弃了它。如果你想接受他的回答,我可以接受。