从链表中删除

时间:2013-05-17 13:07:29

标签: java singly-linked-list

我创建了一个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;
    }
   }

2 个答案:

答案 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,你就会发现一切都会更容易理解,因为你不会混淆列表的实际头部和作为参数传递的不必要的头部。