Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在java中反转单链表_Java_Linked List_Singly Linked List - Fatal编程技术网

在java中反转单链表

在java中反转单链表,java,linked-list,singly-linked-list,Java,Linked List,Singly Linked List,我用java从头制作了一个单链表。代码如下: public class SingleLinkedList<Item> { private Node head; private int size; private class Node { Item data; Node next; public Node(Item data) { this.data = data; this.next = null; }

我用java从头制作了一个单链表。代码如下:

public class SingleLinkedList<Item>
{
private Node head;
private int size;

private class Node
{
    Item data;
    Node next;

    public Node(Item data)
    {
        this.data = data;
        this.next = null;
    }

    public Node(Item data, Node next)
    {
        this.data = data;
        this.next = next;
    }
    //Getters and setters
    public Item getData()
    {
        return data;
    }
    public void setData(Item data)
    {
        this.data = data;
    }
    public Node getNext()
    {
        return next;
    }
    public void setNext(Node next)
    {
        this.next = next;
    }

}

public SingleLinkedList()
{
    head = new Node(null);
    size = 0;
}

public void add(Item data)
{
    Node temp = new Node(data);
    Node current = head;

    while(current.getNext() != null)
    {
        current = current.getNext();
    }

    current.setNext(temp);
    size++;
}

public void add(Item data, int index)
{
    Node temp = new Node(data);
    Node current = head;

    for(int i=0; i<index && current.getNext() != null; i++)
    {
        current = current.getNext();
    }

    temp.setNext(current.getNext());
    current.setNext(temp);
    size++;
}

public Item get(int index)
{
    if(index <= 0)
    {
        return null;
    }

    Node current = head;

    for(int i=1; i<index; i++)
    {
        if(current.getNext() == null)
        {
            return null;
        }

        current = current.getNext();
    }

    return current.getData();
}

public boolean remove(int index)
{
    if(index < 1 || index > size())
    {
        return false;
    }

    Node current = head;
    for(int i=1; i<index; i++)
    {
        if(current.getNext() == null)
        {
            return false;
        }

        current = current.getNext();
    }

    current.setNext(current.getNext().getNext());
    size--;
    return true;
}

public String toString()
{
    Node current = head.getNext();
    String output = "";
    while(current != null)
    {
        output+=current.getData().toString()+"  ";
        current = current.getNext();
    }

    return output;
}

public int size()
{
    return size;
}

public void reverse()
{
    Node current = head;
    Node prevNode = null;
    Node nextNode;

    while(current!=null)
    {
        nextNode = current.getNext();
        current.setNext(prevNode);
        prevNode = current;
        current = nextNode;
        System.out.println(prevNode.getData());
    }

    head = prevNode;

}
1  2  3  4  5  
null
1
2
3
4
5
Exception in thread "main" java.lang.NullPointerException
    at SingleLinkedList.toString(SingleLinkedList.java:129)
    at TEST.main(TEST.java:20)
我试着打印prevNode的值,以检查它是否接受值…但它是。 怎么办

 while(current!=null)
这是你的问题。当你点击最后一个节点时,你得到的“下一个”节点实际上是空的

试着把它改成

while(current!=null&&current.getNext()!=null)

编辑:实际上不确定该解决方案是否有效。尝试在循环的末尾添加一个条件,该条件表示:

if(current.getNext()==null)
    break;

编辑(再次:/):

好吧,对不起,我没想清楚

将最终if语句更改为:

if(current.getNext()==null){
    current.setNext(prevNode);
    break;
}

实际的空指针位于toString中。以下是您要做的:

将while条件更改为

while(current != null&&current.getData()!=null)
否则,如果当前值指向null,则会出现异常


那太累人了。

实际上,你的反向方法看起来不错

问题在于您的toString()方法。
创建新列表时,将创建一个数据为空的初始元素。
您的
toString
方法跳过第一个元素,因此只要您不反转列表,它就可以正常工作。
但是当您反转列表时,该null元素将成为最后一个元素,当您调用
output+=current.getData().toString()+“”
对于最后一个元素,当
current.getData()
为null时,您将得到
NullPointerException

您有几个选择:

  • 您的reverse方法可以首先保留初始的null元素(即反转列表的其余部分,但保持头部不变)。这样,toString可以保持不变
  • 消除初始的null元素。那么您的toString方法就不必跳过任何内容
  • 首先保留空元素:

    public void reverse()
    {
        Node current = head.getNext();
        Node prevNode = null;
        Node nextNode;
    
        while(current!=null)
        {
            nextNode = current.getNext();
            current.setNext(prevNode);
            prevNode = current;
            current = nextNode;
            System.out.println(prevNode.getData());
        }
    
        head.setNext(prevNode);
    
    }
    

    问题出在SingleLinkedList.java toString()方法中

    试试下面,它工作得很好

        public String toString() {
            Node current = head;
            String output = "";
            while (current != null) {
    //            output += current.getData().toString() + "  ";
                output += String.valueOf(current.getData()) + "  ";
                current = current.getNext();
            }
    
            return output;
        }
    

    对于像这样的问题,最好的方法是用纸和铅笔画一个例子,看看指针是如何随着你在程序中的动作而变化的。我都试过了。什么也找不到。也许这就是我做这件事的方式,但我还是被卡住了。你能帮我吗?我试过了,但是现在最后一个节点根本没有显示。第一个节点没有做任何不同的事情。第二个也给出了nullpointerexceptionOk,我将实际测试这一时刻不起作用:(相同的错误。我现在受够了:X感谢您的努力,但不管发生什么,最后一个节点都不会显示。toString()方法在反转之前或之后都有效。@abhyuditjain添加一些建议请不要介意我的知识贫乏。我是新来的。只是学习。我不完全理解你想说的。但是我尝试实现更改,现在有两个问题:(1)反转后最后一个节点不显示;(2)toString()如果我实现了更改,则在反转后仍能正常工作。@abhyuditjain添加了建议的反转修复程序。但没有对其进行测试。替代修复程序需要在更多方法中进行更改,因此如果您选择尝试,我将其留给您。@abhyuditjain您是否尝试了我刚才发布的代码?您不必更改为字符串,而是在不更改代码的情况下解决了我的问题toString()方法。无论如何,谢谢。
        public String toString() {
            Node current = head;
            String output = "";
            while (current != null) {
    //            output += current.getData().toString() + "  ";
                output += String.valueOf(current.getData()) + "  ";
                current = current.getNext();
            }
    
            return output;
        }