[英]removing from a linked list
我做了一个SListClass
,代表单链链接的列表类和一个节点类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;
}
}
将removeFirst
更改为this.head = head.next
。 参数列表中的head
隐藏了类字段head
。
另外,请考虑以下问题:在removeFirst
方法中,您是否真的想要一个head
参数,还是应该改用head
字段,因为那是您要更新的链表的真实标题? 如果您不再需要该参数,只需从方法签名中删除该参数即可; 那么字段head
不会被隐藏,所以head = head.next
很好。
首先,您的命名不好。 每个类都是一个类,因此以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后,您会发现所有内容都更容易找出来,因为您不会将列表的实际标题与作为参数传递的不必要的标题混为一谈。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.