关于java写的链表的一些小问题

废话不多说,先上代码


public class Test {
    public static void main(String[] args) {
        LinkedStack<String> lss = new LinkedStack<String>();
        for (String s : "Phasers on stun".split(" "))
            lss.push(s);
        String s;
        while ((s = lss.pop()) != null) {
            System.out.println(s);
        }
    }
}

class LinkedStack<T> {
    private static class Node<U> {
        U item;
        Node<U> next;
        Node() {
            this.item = null;
            this.next = null;
        }
        Node(U item, Node<U> next) {
            this.item = item;
            this.next = next;
        }
        boolean end() {
            return item == null && next == null;
        }
    }
    private Node<T> top = new Node<T>();
    public void push(T item) {
        top = new Node<T>(item, top);
    }
    public T pop() {
        T result = top.item;
        if (!top.end())
            top = top.next;
        return result;
    }
}

程序经测试可以正常运行,这里采用链表来进行数据的传输,不过比较疑惑的一点是关于遍历的pop方法,哪里判断top不为空的时候指向下一个元素,但是我比较疑惑的是top默认指向的是链表尾端的next,之前的next应该已经覆盖掉了啊,为啥能找得到之前的nex节点呢?而且看一些教程上的便利都是从头节点遍历的,,,为什么能找到之前的next节点?求解惑,感激不尽

慕姐4208626
浏览 473回答 3
3回答

忽然笑

链表只是形式上的链表,什么是形式的链表,是这种数据结构用链表的方式表达是最容易表达出来的。我们先看main主函数走。首先就是拿字符串循环字符一个一个通过push方法进去。然后定义字符串s,通过pop方法把下一个节点的值取出来赋值给s,判空循环取值。主函数大致我读下来就是这样。我们来看Node,首先无参构造先构造空节点,两个参数的构造器的一个参数是指向节点本身,一个指向下一个节点。end方法就是如果当前节点和下一个节点为空时return true,push就不用说了,通过两个参数的构造器赋值,pop就是循环遍历吧,总体就是这样,为什么能够找到next是因为每一个节点的next节点都赋值了。还有为什么拿出来的时候直接指向尾部,U item是指向当前节点,比如你把字符"segmentfault"一个一个字符存进去的时候,存完的时候你的对象你注意看,最后的你的位置,是在t这个字符上的。以上是我的理解哈,数据结构我也挺菜的,不知道说的对不对

精慕HU

为啥不用现成的java.util.LinkedList?
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java