手动链接列表 - 在方法之前插入

时间:2011-07-26 00:40:01

标签: java linked-list

这是我们在课堂上练习的一部分,我只是想不出来......

所需的方法是insertBefore(对象数据)方法,当用户选择此方法时,它将提示它输入要在参考数据之前插入的数据(由用户输入)

应如何运行的示例:

// assuming linked list has data 1,2,3 inserted already

Choose Method:
1)Insert Before

choice: 1 // input by user


====Insert Before====
Enter Reference data: 2 // input by user
Enter Data to be inserted: 5 // input by user

supposed output: 1,5,2,3

这是我练习的代码:(这是一个名为LinkList的变量

的类
protected int end;
protected Node start;

和一个名为Node的内部类

private class Node
{
    public char data;
    public Node next;
    public Node(char data)
    {
        this.data = data;
    }
}


public void insertBef(char ref,char data)
{
    Node temp = new Node(data);
    Node current = start;

    if(end!=0)
    {
        for(int i = 1; i<end; i++)
        {
            if(current == start)
            {
                Node newNode = start;
                newNode.data = current.data;
                newNode.next = temp;
                current = current.next;
            }
            else if(current.data == ref)
            {
                Node newNode = current;
                newNode.data = current.data;
                newNode.next = temp;
                current = current.next;
            }
        }
        end++;

    }
    else
    {
        temp.next = start;
        start = temp;
    }
    end++;
}

但是当我运行我的代码时,它会输出3,5,而不是1,5,2,3!我看不出我可能出错的地方......

有人可以告诉我错误在哪里,并解释我如何解决它?

我知道能够在参考值之前插入:

  • 为新数据创建新节点
  • 为参考值和链接
  • 创建一个临时节点
  • 将参考值之前的数据链接指向新节点,并使新节点的链接指向临时节点

我似乎无法弄清楚如何在Java代码中实现它......

2 个答案:

答案 0 :(得分:4)

编程时,如果看起来很难,你可能会采用错误的方式......

您只需要一行代码即可完成任务!

list.add(list.indexOf(reference), data);

此行包含为insertBefore方法:

public static void insertBefore(List<Integer> list, int reference, int data) {
    list.add(list.indexOf(reference), data);
}

以下是使用您的示例进行的测试:

public static void main(String[] args) {
    List<Integer> list = new ArrayList<Integer>(Arrays.asList(1, 2, 3));
    insertBefore(list, 2, 5);
    System.out.println(list);
}

输出:

[1, 5, 2, 3]

注意:如果找不到引用元素,此代码将抛出异常 我会留给你插上那个洞。

答案 1 :(得分:2)

首先要做的事情:for循环通常是链接列表的坏主意。 while循环要好得多;你可以做while(next != null)之类的事情。

查看您的代码,您似乎遇到了一些问题。

你的for循环过于复杂,似乎没有多大意义。以下是循环的外观:

  1. 获取头节点
  2. 开始循环遍历列表,随时检查下一个节点的值
  3. 一旦发现下一个节点的值是您正在寻找的值,就创建一个新节点。
  4. 通过将其Next值设置为等于当前节点的Next值来插入新节点,然后将当前节点的下一个值设置为新节点。
  5. 从功能返回。
  6. 您的中间要点实际上是不必要的,我不知道您使用end的内容。无论如何,你似乎有基本的原则,所以我不会觉得我通过发布代码来破坏你。

    现在,我不确定你的start是什么。它是否具有值,还是专用的头节点?我投票给一个专用的头节点,我通常觉得它更容易使用,因为你不需要为一个特殊情况添加代码,其中数字应该在头部之前。所以你的起始节点应该是“空的”;它所拥有的值被忽略,它唯一用于保持指向列表中第一个合法节点的指针。如果这样做,insertBef方法变得非常简单。注意:要遵循的未经测试的代码。

    public void insertBef(char ref, char data)
    {
        Node current = start;
    
        while( current.next != null )
        {
            if( current.next.value == ref )
            {
                Node n = new Node(data);
                n.next = current.next;
                current.next = n;
                return;
            }
    
            current = current.next;
        }
    }
    

    请不要只复制代码。如果您有疑问,请发布,我会尽力回答。