设置链表Java

时间:2012-11-05 04:46:52

标签: java linked-list

我正在研究一些基本的链接列表,比如插入,删除,转到列表的前面或末尾,基本上我理解所有这些东西的概念,一旦我有列表我猜,但我有设置列表时遇到问题。我想知道你们是否可以告诉我,我是否朝着正确的方向前进。 (主要是设置)这是我到目前为止:

public class List {

private int size;
private List linkedList;
List head;
List cur;
List next;

/**
 * Creates an empty list.
 * @pre 
 * @post
 */
public List(){
    linkedList = new List();
    this.head = null;
    cur = head; 
}

/**
 * Delete the current element from this list. The element after the deleted element becomes the new current. 
 * If that's not possible, then the element before the deleted element becomes the new current. 
 * If that is also not possible, then you need to recognize what state the list is in and define current accordingly.
 * Nothing should be done if a delete is not possible.
 * @pre
 * @post
 */ 
public void delete(){

}

/**
 * Get the value of the current element. If this is not possible, throw an IllegalArgumentException.
 * @pre the list is not empty
 * @post
 * @return value of the current element.
 */
public char get(){
    return getItem(cur);
}

/**
 * Go to the last element of the list. If this is not possible, don't change the cursor.
 * @pre
 * @post
 */
public void goLast(){
    while (cur.next != null){
        cur = cur.next;
    }
}

/**
 * Advance the cursor to the next element. If this is not possible, don't change the cursor.
 * @pre
 * @post
 */
public void goNext(){
    if(cur.next != null){
        cur = cur.next;}
    //else do nothing
}

/**
 * Retreat the cursor to the previous element. If this is not possible, don't change the cursor.
 * @pre
 * @post
 */
public void goPrev(){

}

/**
 * Go to top of the list. This is the position before the first element.
 * @pre
 * @post
 */
public void goTop(){

}

/**
 * Go to first element of the list. If this is not possible, don't change the cursor.
 * @pre
 * @post
 */
public void goFirst(){

}

/**
 * Insert the given parameter after the current element. The newly inserted element becomes the current element.
 * @pre
 * @post
 * @param newVal : value to insert after the current element.
 */
public void insert(char newVal){
    cur.setItem(newVal);
    size++;
}

/**
 * Determines if this list is empty. Empty means this list has no elements.
 * @pre
 * @post
 * @return true if the list is empty.
 */
public boolean isEmpty(){
    return head == null;
}

/**
 * Determines the size of the list. The size of the list is the number of elements in the list.
 * @pre
 * @post
 * @return size which is the number of elements in the list.
 */
public int size(){
    return size;
}


public class Node {

    private char item;
    private Node next;

    public Node() {
    }

    public Node(char item) {
            this.item = item;
    }

    public Node(char item, Node next) {
        this.item = item;
        this.next = next;
    }

    public char getItem() {
        return this.item;
    }

    public void setItem(char item) {
        this.item = item;
    }

    public Node getNext() {
        return this.next;
    }

    public void setNext(Node next) {
        this.next = next;
    }
}

}

我得到了节点类正常(我认为它可以正常工作),但是有必要甚至有这个类吗?或者我可以在不使用它的情况下继续它(只是好奇)。 例如,在list类中的get()方法中,我无法从节点类调用getItem()方法,因为即使我认为这是节点类的重点,它也会出错。

底线我只是想确保我正确设置列表。

感谢任何帮助人员,我对链接列表很新,所以请耐心等待我!

3 个答案:

答案 0 :(得分:0)

headcurlast应该是Node s,而不是List s。

此外,您应该将Node声明为Node<T>,然后它可以包含任何类型的对象(而不仅仅是char)。您必须将所有单词char替换为T,因此您的班级List也应为List<T>

delete实际上需要删除一个元素,它现在不需要。

此外,您已经提供了List迭代器功能(使用cur)...您可能最好在单独的类中分离该功能(或将列表重命名为“IteratedList”) )或其他什么。

否则一个相当不错的开始!

答案 1 :(得分:0)

我认为你遗漏了一些非常重要的东西 - 还有一些评论。特别是,我认为你应该写一个注释块来解释如何表示列表,包括它在空的时候应该是什么样的,有一个元素,并且有多个元素。用纸和铅笔完成几个场景。

当你知道一个空列表应该是什么样子,并且确保表示符合你所需要的时候,构造函数将非常容易编写。

答案 2 :(得分:0)

据我了解。你正在创建一个链表,所以List对象应该以某种方式使用Node对象,对吧?您希望列表由头(节点),当前(节点),下一个(也是一个节点)以及大小(int)表示。

我认为拥有private List linkedList;是不合理的。为了更好地理解为什么它不起作用,尝试手动初始化列表,你会发现自己初始化一个新的列表,这将导致初始化一个新列表,...等。这是你得到一个的原因之一不管我在设计中告诉你的其他问题,都会出错。

继续努力。您还需要增强删除的实现。要从列表中删除节点,您不仅要减小大小,还应使其上一个节点引用其下一个节点。像prev.next = node.next这样的东西。但是继续工作,你将在这个练习中学到很多东西。