用Java实现循环链​​接列表

时间:2017-10-13 22:30:47

标签: java list hyperlink circular-list

我正在尝试根据以下内容创建循环链接列表: 对列表的唯一访问是单个引用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

1 个答案:

答案 0 :(得分:0)

您面临的所有问题似乎都是因为您没有花时间考虑您的代码必须在纸上做什么。我向您保证,如果您开始在纸上绘制列表,并且链接和箭头表示.next属性的情况,那么您需要编码的行为会突然变得更加明显

1。插入问题

您将面临的第一个也是最明显的问题是您的插入方法。

案例没有链接

这个很好,即使你可以添加一行以使其成为圆形,也会更好。

已包含在列表

中的链接的案例

这是问题开始的地方。练习要求您在当前链接之后添加链接。它从current.next = newLink;开始,但下一行newLink = current;对您没有任何作用,因为它只是将current的值分配给newLink

要考虑的第二个问题是,您永远不会检查当前是否还没有下一个链接。如果确实如此,那么您的代码将有效地分离链接到current链接的所有链接。找到一个解决方案来验证是否已设置next,如果是,则需要找到一种方法在两个现有链接之间插入新链接。

圆形

我觉得圆形的事实让你害怕。它真的不应该。即使只有一个项目,您也可以是圆形。在这种情况下,current.next将与current相同。你已经有了一个变量来知道你有多少元素,所以只需依靠它来知道该怎么做。事实上,一旦它被正确编码,你永远不会有.next等于null。列表为空当前的唯一例外是等于null(即使你也可以避免这种情况,但是没有必要)

2。 displayList问题

这是您需要将列表设为循环的位置。你有正确的想法但是因为你没有循环列表,所以current.next中的一个将指向null,因此你的原始问题。如果您修复了圆形化并插入显示器,则至少在插入后的第一个

3。删除问题

该分配是删除列表中的下一个项目。你可以在一个临时变量中存储你要删除的元素,但是你错过了一些要点:

  1. current = current.next;表示您正在失去实际的电流。这不是你想要做的。首先,你的“光标”不应该移动。其次,current.next此处是您要从列表中删除的项目。
  2. 你需要多考虑一下你需要做些什么才能切断链接。您需要取消current.next对要删除的项目的引用,并将其附加到您要删除的项目之后显示的项目。
  3. 我希望我已经清楚了。有很多小怪癖我不会提及主要是因为它们不影响功能,它们只是一段代码,可以用更好,更清晰的方式重写。