循环单链表

时间:2011-04-01 00:41:18

标签: java linked-list circular-list

我一直在尝试用Java创建循环链接列表。我相信我插入正确,但我不能让我的删除或显示正常工作。这是我的代码。

public class Link
{
  public int data; 
  public Link next;

 public Link(int d)
  {
     data = d;  //store data
     next = null; //set next Link to newLink
  }
}

   public class IntListCircularCount
  {
  private Link first;//this always points to the first link.
  private Link current=null;
  private int count =0;

  public IntListCircularCount()
  {
     first = null;
  }

  public boolean isEmpty()
  {
     return (first==null);
  }

  public Link getFirst()
  {
     return first;
  }   

  public void insert(int n)
  {
     if(count == 0)
     {
        Link newLink = new Link(n);
        first=newLink;
        count++;
        current = first;       
     }
     else if(count>0)
     {
        Link newLink = new Link(n);
        first.next = newLink;
        newLink.next = first;
        count++;
        current = first.next;
     }
  }

  public void display(int width)
  {
     if(isEmpty())
        System.out.printf("%" + width + "s", "--");
     else if(count ==1)
        System.out.printf("%" + width + "d",first.data);
     else if(!isEmpty() && first.next !=first)
     {
        while (first !=current)
        {       
           System.out.printf("%" + width + "d", current.data);
           current = current.next;
        }
     }   
  }

  public void delete()
  {
     if(count==0)
     {
        first=null;
     }
     else if(count==1)
     {            
        first = first.next;
     }
     else if(count>1)
     {
        current.next=first.next;
        first = first.next;
        count--;
     }
    }
 }


  public class IntListUser
 {
  public static void main (String[] args)
  {
     final int n =5;//there will be n Links
     final int w=5; //field width for display
     IntListCircularCount list = new IntListCircularCount();
     for(int i=1; i<=n; i++)
     {
        list.display(w);
        list.insert(10*i);
     }
     list.display(w);


     System.out.println("  -------------end of inserting ----------------");
     list.delete();
     list.display(w);
         list.delete();
     list.display(w);
        list.delete();
     list.display(w);
        list.delete();
     list.display(w);
        list.delete();
     list.display(w);
  }
  }

1 个答案:

答案 0 :(得分:0)

在编写任何代码之前,我通常会做一些napking草图。他们给我省了很多麻烦。

好的,但是对于你的问题:

您的插入仅在第一个元素之后插入。如果您的当前指向结束,那么当您插入新元素时,它应该链接到当前,而不是第一个。并且当前应始终指向第一个(使列表为圆形),即使只有一个元素。

public void insert(int n)
  {
  if(count == 0)
  {
     Link newLink = new Link(n);
     first=newLink;
     count++;
     current = first;
     current.next = first;     
  }
  else
  {
     Link newLink = new Link(n);
     current.next = newLink;
     newLink.next = first;
     count++;
     current = current.next;
  }
}

此外,您的显示器需要从第一个显示到当前显示,但您不应该先丢失和当前显示。

public void display(int width)
{
   Link display_me = first;
   if(isEmpty())
      System.out.printf("%" + width + "s", "--");
   else 
   {
      Link display_me = first;
      do {       
         System.out.printf("%" + width + "d", current.data);
         display_me= display_me.next;
      } while (first != display_me);

   }   
}

至于删除,我不知道你是想删除第一个还是当前的。

希望这有帮助。