-1

我正在尝试使用 Java 实现链接列表。我使用的代码如下

public class LinkNode
{
private int data;
public LinkNode next;
public LinkNode (int data)
{
this.data = data;   
}
public void setData(int data)
{
this.data = data;   
}
public int getData()
{
return this.data;   
}
public void setNext(LinkNode next)
{
 this.next = next;  
}
public LinkNode getNext()
{
    return this.next;
}

public static void main (String [] args)
{

LinkNode Node1 = new LinkNode(3);
LinkNode Head = Node1;
LinkNode Node2 = new LinkNode(4);
LinkNode Node3 = new LinkNode(5);
LinkNode Node4 = new LinkNode(6);
Head.setNext(Node1);
Node1.setNext(Node2);
Node2.setNext(Node3);
Node3.setNext(Node4);
int iCounter =0;
LinkNode currentNode= Head;
while (currentNode.getNext()!=null)
{
    int data = currentNode.getData();
    System.out.println(data);
    currentNode = currentNode.getNext();
    iCounter=iCounter+1;

}
System.out.println("No Of Nodes are"+iCounter);
}
}

这里的问题是我没有节点3

该代码不计算最后一个节点 Node4。

输出如下

3
4
5
No Of Nodes are3

请让我知道代码中有什么问题。

4

3 回答 3

1

使 Head 指向 Node1 写入

Head = Node1;

如果你写 Head=null 这意味着 Head 不指向任何节点,你会得到一个空指针异常,因为你试图从一个不存在的节点获取下一个节点。

第二个问题是您在currentNode.getNext()返回时退出循环nullgetNext()当您到达列表的最后一个节点时,该方法返回 null;如果退出循环,则不会计算最后一个节点。将循环条件更改为:

while (currentNode != null)

请不要编辑问题来提出后续问题。编辑问题时不会通知任何人,因此您不会得到新的答案。它还使该网站对未来的访问者不太有用。为您遇到的每个问题发布一个新的“问题”。

于 2013-09-06T09:45:59.517 回答
0

这是我多年前开发的单链表的实现:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * @author sergiizagriichuk
 */
public class Node<T> {

    private T value;
    private Node<T> next;

    public Node(T value) {
        this.value = value;
    }

    public static <T> Node<T> createLinkedListFromArray(T... array) {

        if (checkIfArrayIsNullOrEmpty(array)) return new Node<T>(null);

        Node<T> head = new Node<T>(array[0]);

        createLinkedList(array, head);

        return head;
    }

    private static <T> boolean checkIfArrayIsNullOrEmpty(T[] array) {
        return array == null || array.length == 0;
    }

    private static <T> void createLinkedList(T[] array, Node<T> head) {

        Node<T> node = head;

        for (int index = 1; index < array.length; index++) {
            T t = array[index];
            node.setNext(new Node<T>(t));
            node = node.getNext();
        }
    }

    public T getValue() {
        return value;
    }

    public void setValue(T value) {
        this.value = value;
    }

    public Node<T> getNext() {
        return next;
    }

    public void setNext(Node<T> next) {
        this.next = next;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        Node node = (Node) o;
        return value != null && value.equals(node.value);

    }

    @Override
    public int hashCode() {
        return value.hashCode();
    }

    @Override
    public String toString() {
        List ret = createList();
        return Arrays.toString(ret.toArray());
    }

    private List createList() {
        Node root = this;
        List ret = new ArrayList();
        while (root != null) {
            ret.add(root.getValue());
            root = root.getNext();
        }
        return ret;
    }
}

还有一些测试:

/**
 * @author sergiizagriichuk
 */
public class NodeTest {
    @Test
    public void testCreateList() throws Exception {
        Node<Integer> node = Node.createLinkedListFromArray(1, 2, 3, 4, 5);
        Assert.assertEquals(Integer.valueOf(1), node.getValue());
        Assert.assertEquals(Integer.valueOf(2), node.getNext().getValue());
    }

    @Test
    public void testCreateListSize() throws Exception {
        Integer[] values = new Integer[]{1, 2, 3, 4, 5};
        int size = values.length - 1;

        Node<Integer> node = Node.createLinkedListFromArray(values);

        int count = 0;

        while (node.getNext() != null) {
            count++;
            node = node.getNext();
        }

        Assert.assertEquals(size, count);
    }

    @Test
    public void testNullNode() throws Exception {
        Node<Integer> nullNode = new Node<Integer>(null);

        assertNullNode(nullNode);
    }

    @Test
    public void testNullArray() throws Exception {
        Node<Integer> nullArrayNode = Node.createLinkedListFromArray();
        assertNullNode(nullArrayNode);

    }

    @Test
    public void testSetValue() throws Exception {

        Node<Integer> node = new Node<Integer>(null);

        assertNullNode(node);

        node.setValue(1);

        Assert.assertEquals(Integer.valueOf(1), node.getValue());
    }

    private void assertNullNode(Node<Integer> nullNode) {
        Assert.assertNotNull(nullNode);
        Assert.assertNull(nullNode.getValue());
    }

}

尝试根据您的情况使用或重新开发

于 2013-09-06T14:30:10.220 回答
0

头,不应为空。相反,head 中的数据应该为空,否则您无法找到下一个。

于 2013-09-06T09:48:27.083 回答