这是我们在课堂上练习的一部分,我只是想不出来......
所需的方法是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代码中实现它......
答案 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循环过于复杂,似乎没有多大意义。以下是循环的外观:
您的中间要点实际上是不必要的,我不知道您使用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;
}
}
请不要只复制代码。如果您有疑问,请发布,我会尽力回答。