我创建了一个SListClass
代表sinle-linked列表类和一个节点类SListNode
。我遇到了removeLast
方法的问题。当我打印出节点列表时,第一个项目仍在那里。我不明白为什么
public class SListClass {
private SListNode head;
private double size;
SListClass(){
head = null;
size = 0;
}
SListClass(SListNode node){
head = node;
}
public void insertFront(int item){
head = new SListNode(item, head);
size++;
}
public void addLast(SListNode head, int value){
SListNode first = head;
while(first.next != null){
first = first.next;
}
first.next = new SListNode(value, null);
size++;
}
public void removeFirst(SListNode head){
head = head.next;
}
/*public String toString(){
return String.format(head + "");
}
*/
public String print(){
String result = head.item + " ";
if(head.next != null){
result += head.next.print();
}
return result;
}
public static void main(String[] args) {
SListNode list = new SListNode(21, new SListNode(5, new SListNode(19, null)));
SListClass x = new SListClass(list);
x.insertFront(33);
x.insertFront(100);
x.addLast(list, 123);
x.addLast(list, 9999);
x.removeFirst(list);
System.out.println(x.print());
}
}
output: 100 33 21 5 19 123 9999
SListNode
类:
public class SListNode {
protected int item;
protected SListNode next;
public SListNode(int item, SListNode next){
this.item = item;
this.next = next;
}
public SListNode(int item){
this(item, null);
}
public int getItem() {
return item;
}
public void setItem(int item) {
this.item = item;
}
public SListNode getNext() {
return next;
}
public void setNext(SListNode next) {
this.next = next;
}
}
答案 0 :(得分:1)
将removeFirst
更改为this.head = head.next
。参数列表中的head
隐藏了类字段head
。
另外,请考虑一下:在removeFirst
方法中,您确实需要head
参数,还是应该使用head
字段,因为这是链接的真正头列表你想要更新?如果您不再需要该参数,只需从方法签名中删除该参数;然后,字段head
未隐藏,因此head = head.next
可以正常使用。
答案 1 :(得分:1)
首先,你的命名很糟糕。每个类都是一个类,因此用Class
结束类的名称只是噪音。相反,S
并不意味着什么。如果你必须解释SListClass代表什么,那么这意味着名称是坏的,你应该选择另一个名称,这不需要任何解释,如SinglyLinkedList
。
您班级的用户不应该关心列表如何保留信息。它永远不应该将Node传递给任何方法。只有一个价值。因此,应修改以下方法:
SListClass(SListNode node)
- > SinglyLinkedList(int value)
void addLast(SListNode head, int value)
- > void addLast(int value)
:列表知道头节点是什么。把它作为论点传递是没有意义的。void removeFirst(SListNode head)
- > void removeFirst()
:列表知道第一个节点是什么。将它作为参数传递是没有意义的一旦你获得了正确的API,你就会发现一切都会更容易理解,因为你不会混淆列表的实际头部和作为参数传递的不必要的头部。