下面的代码是有问题的...
但是要求代码中必须用到reverse方法.感觉有点强制使用的味道.
这个算法就是将链表倒序输出.
除了reverse代码不是我写的,其它的都是.
书上说这是个倒序的方法,但我感觉怎么看都不像...
如何修改前面的代码来符合后面的代码呢?
最好能朋友帮忙解释下reverse方法是如何做到单链表的倒序的.import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;class Node{
int data; //数据域
Node next;
}
public class Link {
private Node header;
public Link() {}
public Link(int n){ //n为需要创建链表中的结点个数
Node p,q; //p为链表中当前的最后结点,q为要新加的结点
header = new Node();
header.data = (int)(Math.random()*100);
p = header;
for(int i=0; i<n-1; ++i){
q = new Node();
q.data = (int)(Math.random()*100);
p.next = q;
p = q;
}
}
public void outputLink(){
Node p = header;
while(p != null){
System.out.print(p.data + "->");
p = p.next;
}
System.out.println();
}
public static void main(String[] args){
int a = 0; //初始化是为了防止读取用户输入个数失败
try{
String s;
System.out.print("请输入您创建的链表中的结点个数: ");
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
s = br.readLine();
a = Integer.parseInt(s);
}
catch(IOException e){}
Link x = new Link(a);
System.out.println("随机创建的链表个数为:" + a);
System.out.print("随机创建的链表为:");
x.outputLink();
System.out.print("倒序后的链表为:");
reverse(x);
x.outputLink();
}
static Link reverse(Link list){
Link rev = null;
Link runner = list;
while(runner != null){
Link newNode = new Link();
newNode.data = runner.data;
newNode.next = rev;
rev = newNode;
runner = runner.next;
}
return rev;
}
}

解决方案 »

  1.   

    代码编译还有问题,不高兴改了,链表倒序的话是这样的先把原先链表的头这里(假设为a)拿到,然后把a指向的那个元素b指向的元素让a指向他,再把b放到a的前面,然后不断的把a指向的那个元素放到最前面去,知道最后为null,这样就倒叙好了
      

  2.   

    你的意思是不能够改动reverse方法,而只能改动其他的部分吗?
      

  3.   

    恩,算法我懂~!只是看不懂这个算法是啥意思.感觉是错的.能解释下吗?恩,就是这个意思.或者能帮我把reverse方法给注释下,我感觉算法是错的.
      

  4.   


    package link.test;import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;public class Link {
    public int data; public Link next; private Link header; public Link() { } public Link(int n) {
    Link p = null;
    Link q = null;
    header = this;
    header.data = (int) (Math.random() * 100);
    p = header;
    for (int i = 0; i < n - 1; ++i) {
    q = new Link();
    q.data = (int) (Math.random() * 100);
    p.next = q;
    p = q;
    } } public void outputLink() {
    Link p = this;
    while (p != null) {
    System.out.print(p.data + "->");
    p = p.next;
    }
    System.out.println();
    } public static void main(String[] args) {
    int a = 0; // 初始化是为了防止读取用户输入个数失败
    try {
    String s;
    System.out.print("请输入您创建的链表中的结点个数: ");
    BufferedReader br = new BufferedReader(new InputStreamReader(
    System.in));
    s = br.readLine();
    a = Integer.parseInt(s);
    } catch (IOException e) {
    }
    Link x = new Link(a);
    System.out.println("随机创建的链表个数为:" + a);
    System.out.print("随机创建的链表为:");
    x.outputLink();
    System.out.print("倒序后的链表为:");
    x = reverse(x.header);
    x.outputLink();
    } static Link reverse(Link list) {
    Link rev = null;
    Link runner = list;
    while (runner != null) {
    Link newNode = new Link();
    newNode.data = runner.data;
    newNode.next = rev;
    rev = newNode;
    runner = runner.next;
    }
    return rev;
    }
    }
    输出为:
    请输入您创建的链表中的结点个数: 6
    随机创建的链表个数为:6
    随机创建的链表为:95->19->96->98->12->49->
    倒序后的链表为:49->12->98->96->19->95->
    呵呵,说实话,真的是很容易引起混淆~~而且我想也许你把结构理解错了吧,所以才会这样。
    Link自身其实就是这个连标的头。它自身保存自身的引用作为下一个节点。这个reverse函数没有问题。它要你把表头传递进去,而后进行反转。
    代码你先试验一下,最好Debug跟踪一下代码。或者画图理解一下。
    希望对你有所帮助~~加油!!如果我还能做点什么就告诉我~~呵呵,饿死了~~