我正在研究一些基本的链接列表,比如插入,删除,转到列表的前面或末尾,基本上我理解所有这些东西的概念,一旦我有列表我猜,但我有设置列表时遇到问题。我想知道你们是否可以告诉我,我是否朝着正确的方向前进。 (主要是设置)这是我到目前为止:
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()方法,因为即使我认为这是节点类的重点,它也会出错。
底线我只是想确保我正确设置列表。
感谢任何帮助人员,我对链接列表很新,所以请耐心等待我!
答案 0 :(得分:0)
head
,cur
和last
应该是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
这样的东西。但是继续工作,你将在这个练习中学到很多东西。