1

我做了一个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;
    }
   }
4

2 回答 2

1

首先,你的命名不好。每个班级都是班级,因此以班级名称结尾Class只是噪音。反倒S没有任何意义。如果一定要说明 SListClass 代表什么,那就说明名字不好,应该换个名字,不需要解释,比如SinglyLinkedList.

您班级的用户不应该关心列表如何保留信息。它永远不必将节点传递给任何方法。只有一个值。所以应该修改以下方法:

  • SListClass(SListNode node)-->SinglyLinkedList(int value)
  • void addLast(SListNode head, int value)--> void addLast(int value):列表知道头节点是什么。将其作为参数传递是没有意义的。
  • void removeFirst(SListNode head)--> void removeFirst():列表知道第一个节点是什么。将其作为参数传递是没有意义的

一旦你得到正确的 API,你会发现一切都会更容易弄清楚,因为你不会混淆列表的实际头部和作为参数传递的不必要的头部。

于 2013-05-17T13:17:02.570 回答
1

将 更改removeFirstthis.head = head.next。参数列表中的head隐藏了类字段head

另外,考虑一下:在一个removeFirst方法中,您真的需要一个head参数,还是应该使用该head字段,因为这是您尝试更新的链表的真正头部?如果您不再需要该参数,只需从方法签名中删除该参数即可;那么该字段head没有隐藏,所以head = head.next很好。

于 2013-05-17T13:08:43.500 回答