2013-05-07 176 views
0

我一直在做这项任务很长一段时间。我终于让测试人员打印列表中的内容和方法,但现在我需要连接列表中的元素,形成一个圆圈,并在删除或添加元素时以这种方式保留它们。我的书不包括关于循环链表的任何内容,我试图将我在这里看到的几个样本的概念应用于循环链表,但没有取得任何成功。尝试将链接列表转换为循环链接列表

我会非常感谢任何帮助。

以下是我有:

import java.util.NoSuchElementException; 

/** 
A circular linked list. 
*/ 
public class LinkedList 
{ 
    private Node last; 
    // Don't add other instance fields 
    /** 
    Constructs an empty linked list. 
    */ 
    public LinkedList() 
    { 
     last = null; 
    } 

    /** 
    Returns the first element in the linked list. 
    @return the first element in the linked list 
    */ 
    public Object getFirst() 
    { 
     //. . . 
     if (last == null) 
      throw new NoSuchElementException(); 
     return last.data; 
    } 

    /** 
    Removes the first element in the linked list. 
    @return the removed element 
    */ 
    public Object removeFirst() 
    { 
     //. . . 
     if (last == null) 
      throw new NoSuchElementException(); 
     Object element = last.data; 
     last = last.next; 
     return element; 
    } 

    /** 
    Adds an element to the front of the linked list. 
    @param element the element to add 
    */ 
    public void addFirst(Object element) 
    { 
     //. . . 
     Node newNode = new Node(); 
     newNode.data = element; 
     newNode.next = last; 
     last = newNode; 
    } 

    /** 
    Adds an element to the end of the linked list. 
    @param element the element to add 
    */ 
    public void add(Object element) 
    { 
     //. . . 
     if (last == null) 
     { 
      addFirst(element); 
      //position = last;//had to comment out 
     } 
     else 
     { 
      Node newNode = new Node(); 
      newNode.data = element; 
      newNode.next = last.next; 
      last.next = newNode; 
      last = newNode; 
     } 
    } 

    /** 
    Returns an iterator for iterating through this list. 
    @return an iterator for iterating through this list 
    */ 
    public ListIterator listIterator() 
    { 
     return new LinkedListIterator(); 
    } 

    private class Node 
    { 
     public Object data; 
     public Node next; 
    } 

    private class LinkedListIterator implements ListIterator 
    {    
     private Node position; 
     private Node previous; 

     /** 
     Constructs an iterator that points to the front 
     of the linked list. 
     */ 
     public LinkedListIterator() 
     { 
      position = null; 
      previous = null; 
     } 

     /** 
     Moves the iterator past the next element. 
     @return the traversed element 
     */ 
     public Object next() 
     { 
      //. . . 
      if (!hasNext()) 
       throw new NoSuchElementException(); 
      previous = position; //remeber for remove 

      if (position == null) 
       position = last; 
      else 
       position = position.next; 

      return position.data; //correct line 
     } 

     /** 
     Tests if there is an element after the iterator 
     position. 
     @return true if there is an element after the iterator 
     position 
     */ 
     public boolean hasNext() 
     { 
      //. . . 
      if (position == null) 
       return last != null; 
      else 
       return position.next !=null; 
     } 

     /** 
     Adds an element before the iterator position 
     and moves the iterator past the inserted element. 
     @param element the element to add 
     */ 
     public void add(Object element) 
     { 
      //. . . 
      if (position == null) 
      { 
       addFirst(element); 
       position = last; 
      } 
     } 

     /** 
     Removes the last traversed element. This method may 
     only be called after a call to the next() method. 
     */ 
     public void remove() 
     { 
      //. . . 
      if (previous == position) 
       throw new IllegalStateException(); 
      if (position == last) 
      { 
       removeFirst(); 
      } 
      else 
      { 
       previous.next = position.next; 
      } 
      position = previous; 
     } 

     /** 
     Sets the last traversed element to a different 
     value. 
     @param element the element to set 
     */ 
     public void set(Object element) 
     { 
      if (position == null) 
       throw new NoSuchElementException(); 
      position.data = element; 
     } 

    } 
} 
+0

根据你的类名称:“LinkedListIterator”。你想要做迭代器或循环(双)链表? – 2013-05-07 08:51:28

+0

它是一个内部类迭代器 – irm 2013-05-07 08:56:14

+0

尝试'root.next = // some_node'和'root.prev = tail;'和'tail.next = root;'和'some_node.next = tail;'。我认为这应该工作。 – 2013-05-07 14:55:11

回答

0

下面的代码将帮助您创建循环链表

class CircularLinkedList 
{ 
    class Node 
    { 
     int data; 
     Node next, prev; 

     public Node(int data) 
     { 
      this.data = data; 
     } 
    } 

    private Node head; 
    private int count; 

    public Node getHead() 
    { 
     return head; 
    } 

    public int getCount() 
    { 
     return count; 
    } 

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

    // Add new node after the "head" 
    public void add(int data) 
    { 
     Node n = new Node(data); 
     if(isEmpty()) 
     { 
      head = n; 
      n.next = head; 
      n.prev = head; 
     } 
     else 
     { 
      n.next = head.next; 
      n.prev = head; 
      head.next = n; 
      n.next.prev = n; 
     } 
     count++; 
    } 

    // Remove the node pointed by "head" 
    public void remove() 
    { 
     if(isEmpty()) 
      return; 

     if(count==1) 
      head = null; 
     else 
     { 
      Node tmp = head; 
      tmp.prev.next = tmp.next; 
      tmp.next.prev = tmp.prev; 
      head = head.next; 
      tmp.next = tmp.prev = null; 
     } 
     count--; 
    } 

    public void print() 
    { 
     Node tmp = head.next; 
     while(tmp!=head) 
     { 
      System.out.println(tmp.data+" "); 
      tmp = tmp.next; 
     } 
    } 
} 

上面的代码将会给你一个想法如何创建循环链表,节点被添加,打印和删除。
注意:因为这是你的任务,所以我没有提供给你确切的代码。你可以使用它并以你需要的方式理解和调整它。通过这个,你将对圆形链表有很好的想法

如果你有任何问题。问我们。所以总是欢迎你:)

+0

感谢您的帮助!我不认为我想为这项任务使用计数器。我应该从我的add方法中调用迭代器内部类中的方法来正确放置新节点?我相信add方法应该添加列表末尾的节点并连接到列表中的第一个项目。 – irm 2013-05-08 14:25:56

+0

n.next = head.next;导致代码被破坏 – Yuantao 2013-11-26 04:45:04

+0

@grisson:您能否让我知道代码在您指定的行中如何中断?和'if'部分一样,我正在检查'head'是否被初始化。如果是,那么执行这个语句'n.next = head.next' – asifsid88 2013-12-08 17:45:11