我正在尝试根据以下内容创建循环链接列表: 对列表的唯一访问是单个引用current,它可以指向列表中的任何链接,并且可以根据需要在列表中移动。 该列表应该处理插入,搜索和删除:这些操作在当前指向的链接的下游发生一个链接。 能够显示列表。
1)类循环链表的数据成员应包括参考当前值和变量,以跟踪循环列表中链接的大小。
2)在课程循环中定义的方法包括:
•insert:在当前链接后插入 •删除:删除当前的一个 •find:找到给定密钥的链接 •deleteKey:删除给定密钥的链接 •displayList:显示列表(列表中的所有链接) •step:将当前移动到下一个链接 •peek:返回当前存储的数据 •isEmpty:检查列表是否为空
这是我当前的代码(现在它是线性的 - 尚未使它成为圆形):
public class CircularList<T> {
private Link current; // ref to the current link in the list
private int nLinks; //Reference to number of links in the list
//--------------------------------------------------------------
public CircularList() // constructor
{
current = null;
nLinks = 0;
} //End constructor method - CircularList()
// -------------------------------------------------------------
public void insert(long dd)
{
Link newLink = new Link(dd); // make new link
if (nLinks == 0)
{
current = newLink;
nLinks++;
}
if(nLinks != 0)
{
current.next = newLink; // current --> newLink
newLink = current;
nLinks++;
}
} //End insert()
// --------------------------------------------------------------
public Link delete() // delete link after current
{
Link temp = null;
if(nLinks == 0) //first check whether the list is empty
return null;
if(nLinks != 0)
{
temp = current.next; // save reference to link
current = current.next; // delete it: current-->one after current
nLinks--;
}
return temp; // return deleted link
} //End delete()
// -------------------------------------------------------------
public void displayList()
{
System.out.print("List: ");
int tempLinks = nLinks;
while(tempLinks > 0) // until end of list
{
current.displayLink(); // print data
tempLinks--; // decrement nLinks
current = current.next; // move to next link
}
System.out.println("");
} //End displayList()
// -------------------------------------------------------------
public boolean isEmpty() // true if list is empty
{
return (current==null);
} //End isEmpty()
// -------------------------------------------------------------
public void step() //Move current to next Link
{
current = current.next;
} //End step()
} //End CircularList Class
当它运行时,我得到一个空指针异常。 (我在想,当我尝试调用display方法时,我的insert方法有问题导致这个问题)我很确定它没有正确插入所有4个链接。当我尝试显示它时,它只显示数据2和8,它们是插入的第一个和最后一个项目。
我的链接类:
public class Link {
public long dData; // data item
public Link next; // next link in list
// -------------------------------------------------------------
public Link(long d) // constructor
{
dData = d;
next = null;
}
// -------------------------------------------------------------
public void displayLink() // display this link
{
System.out.print(dData + " ");
}
// -------------------------------------------------------------
} //End Link Class
我的App类:
public class CircularLinkListApp {
public static void main(String[] args) {
CircularList theList = new CircularList(); // make new list
theList.insert(2); // insert four items
theList.insert(4);
theList.insert(6);
theList.insert(8);
theList.displayList(); // display list
while( !theList.isEmpty() ) // until it's empty,
{
Link aLink = theList.delete(); // delete link
System.out.print("Deleted "); // display it
aLink.displayLink();
System.out.println("");
}
theList.displayList(); // display list
} // end of main()
} //End CircularLinkListApp class
答案 0 :(得分:0)
您面临的所有问题似乎都是因为您没有花时间考虑您的代码必须在纸上做什么。我向您保证,如果您开始在纸上绘制列表,并且链接和箭头表示.next
属性的情况,那么您需要编码的行为会突然变得更加明显
您将面临的第一个也是最明显的问题是您的插入方法。
这个很好,即使你可以添加一行以使其成为圆形,也会更好。
这是问题开始的地方。练习要求您在当前链接之后添加链接。它从current.next = newLink;
开始,但下一行newLink = current;
对您没有任何作用,因为它只是将current
的值分配给newLink
。
要考虑的第二个问题是,您永远不会检查当前是否还没有下一个链接。如果确实如此,那么您的代码将有效地分离链接到current
链接的所有链接。找到一个解决方案来验证是否已设置next
,如果是,则需要找到一种方法在两个现有链接之间插入新链接。
我觉得圆形的事实让你害怕。它真的不应该。即使只有一个项目,您也可以是圆形。在这种情况下,current.next
将与current
相同。你已经有了一个变量来知道你有多少元素,所以只需依靠它来知道该怎么做。事实上,一旦它被正确编码,你永远不会有.next
等于null。列表为空当前的唯一例外是等于null(即使你也可以避免这种情况,但是没有必要)
这是您需要将列表设为循环的位置。你有正确的想法但是因为你没有循环列表,所以current.next中的一个将指向null,因此你的原始问题。如果您修复了圆形化并插入显示器,则至少在插入后的第一个
该分配是删除列表中的下一个项目。你可以在一个临时变量中存储你要删除的元素,但是你错过了一些要点:
current = current.next;
表示您正在失去实际的电流。这不是你想要做的。首先,你的“光标”不应该移动。其次,current.next
此处是您要从列表中删除的项目。current.next
对要删除的项目的引用,并将其附加到您要删除的项目之后显示的项目。我希望我已经清楚了。有很多小怪癖我不会提及主要是因为它们不影响功能,它们只是一段代码,可以用更好,更清晰的方式重写。