【问题标题】:Get Method, Insert, and Remove At Methods For a Custom Linked List自定义链接列表的获取方法、插入和删除方法
【发布时间】:2013-02-06 01:49:45
【问题描述】:

尝试在我正在创建的自定义链接列表中实现这三种方法时遇到了很多麻烦。即使我有一个现有的链接列表,get(int pos) 方法也会为除第 0 个索引之外的所有内容返回 null!我的 removeAt(int pos) 和 insert(int pos, int n) 方法也有同样的问题。我将包含我认为相关的所有内容。

我的节点类

    public class MyNode 
   {
      public int cargo;
      public MyNode next;

      public MyNode()
      {
        cargo = 0;
        next = null;
      }

      public MyNode(int i)
      {
        cargo = i;
        next = null;
      }
   }

我的自定义链接列表

public class MyLinkedList 
{
MyNode head;
int size;

public MyLinkedList()
{
    head = null;
    size = 0;
}

public int get(int pos)
{
    MyNode current = new MyNode();
    for(int i = 0; i <= pos && current != null; i++)
    {
        if(pos == 0){
            current = head;
        }else{
            current = current.next;
            break;
        }
    }
    return current.cargo;
}

public void insert(int pos, int n)
{
    MyNode current = new MyNode(n);
    MyNode before = new MyNode(get(pos-1));
    if(before.next != null)
    {
        before.next = current.next;
    }
    else
    {
        before.next = current;
    }
    size++;
    System.out.println("Inserted " + n + " at position " + pos);
}
public void removeAt(int pos)
{
    MyNode before = new MyNode(get(pos -1));
    MyNode remove = new MyNode(get(pos));
    MyNode after = null;

    int cargo = remove.cargo;

    if(remove.next != null)
    {
        after = remove.next;
    }
    before.next = after;
    size--;
    System.out.println("Removed " + cargo + " from position " + pos);
}
}

我的测试数据

l.add(17);
l.add(14);
l.add(43);
l.add(50);
System.out.println(l.get(1));

在 sysout 处返回 NullPointer 异常

【问题讨论】:

    标签: java linked-list nodes singly-linked-list


    【解决方案1】:

    好吧,关于您的get 问题,如果pos != 0 出现,您将跳出循环。

    另外,您的列表退出条件是错误的。应该是&lt; pos 而不是&lt;= pos

    另外,当你的循环存在时,current 有可能为空,然后会得到一个空指针异常。

    【讨论】:

      【解决方案2】:

      您正在创建太多项目。 insert 正在创建 2 个项目,只需要第一个。 removeAt 正在创建另外 2 个节点。其中大部分需要删除。

      进行以下更改并再次测试。

      MyNode before = get(pos-1);
      
      MyNode before = get(pos -1);
      MyNode remove = get(pos);
      

      编辑:.. 即使get 中的MyNode current = new MyNode(); 也是不必要的。

      编辑:您的核心问题get 返回的是数据而不是元素,您应该编写一个返回Node 的版本,并在所有内部方法中使用它,就像上面一样。当前的方法是让您创建立即销毁的新节点,因为它们没有正确插入到列表中。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-31
        • 1970-01-01
        相关资源
        最近更新 更多