控制链表实现中的push和pop方法

时间:2016-03-18 11:20:42

标签: java linked-list

我正在通过使用eclipse阅读java语言中的树实现... 我发现需要实现推送和流行方法......以下是我老师实施的两种方法:

public class LimitedStack<E> {
    private Node<E> first; // refererar till första elementet i listan
    private Node<E> last; // refererar till sista elementet i listan
    private int size; // antal element i listan
    private int maxSize; // maximalt antal tillåtna element i listan

    public LimitedStack(int maxSize) {
        first = last = null;
        size = 0;
        this.maxSize = maxSize;
    }

    public void push(E x) {
        Node<E> n = new Node<E>(x);
        if (first == null) {//no overflow in this case
            first = n;
            size++;
        } else { // add new node to front
            n.next = first;
            first = n;
            if (size == maxSize) { //overflow, at least two elements
                Node<E> p = first;
                while (p.next.next != null) { //lookup second last
                    p = p.next;
                }
                p.next = null; //remove last from list
            } else { //no overflow, increase size
                size++;
            }
        }
    }

    public E pop() {
        if (size == 0) {
            return null;
        }
        E temp = first.element;
        first = first.next;
        size--;
        return temp;
    }
}

当我自己实施这些方法时,我确实喜欢这样:

public void push(E x) {
    if(first == null) {
        first = new Node<E>(x);
    } else if (size==maxSize) {
        Node<E> act = first;
        last =null;
        first = new Node<E>(x);
        first.next=act;
    } else {
        Node<E> act = first;
        first = new Node<E>(x);
        first.next=act;
    }
    size++;
}


public E pop() {
    if(size == 0) {
        return null;
    } else {
        Node<E> act = first;
        first = act.next;
       return act.element;
       size--;
    }
}

如果我将其与老师的答案进行比较,我的实施是否正确?

由于

2 个答案:

答案 0 :(得分:0)

不,这不正确。在pop函数中返回语句后减小大小。

答案 1 :(得分:0)

这不正确。

push()中,您将其分为3个条件。

  1. 链接列表为空
  2. 链接列表已满
  3. 链表既不空也不完整
  4. 您的代码将在第二个条件下失败。当链接列表已满时,根据老师的回答,您应该将新元素推入列表删除列表中的最后一个元素链接的大小列表未经修改

    在您的代码中,您没有删除最后一个元素。您将last设置为null 但是您从未将last设置为正确值而不是null 。由于您将size置于size++之外,因此链接列表的if else仍会增加。

    所以push()的代码应该是这样的:

    public void push(E x) {
        Node<E> newNode = new Node<E>(x);
        if(first == null) {
            first = newNode;
            size++;
        } else if (size==maxSize) {
            Node<E> act = first;
            // last =null;
            first = newNode;
            first.next=act;
        } else {
            Node<E> act = first;
            first = newNode;
            first.next=act;
            size++;
        }
    }
    

    以及您的pop()功能。您实际上可以看到您的代码与教师的代码非常相似。但是,您需要将size--;放在return act.element;之前,因为当该方法执行return语句时, 将退出方法并返回调用方,至少在你的代码中。

    正如@SashaSalauyou所说,这不是一棵树,它现在只是一个链表,你至少应该向你的test codespush()写一些pop()来查看是否你的链表是否正确。例如,您可以尝试推送一些值并在main中弹出一些值,并使用调试器检查链表是否正常工作。

相关问题