账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    关于java写的链表的一些小问题
    31
    0

    废话不多说,先上代码

    
    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节点?求解惑,感激不尽

    0
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • 链表是一种数据结构,其中每个节点包含一个数据元素(通常称为元素)和一个指向下一个节点的指针。在Java中,我们可以使用ArrayList、LinkedList和Stack等类来实现链表。以下是一些关于链表的小问题:

      1. LinkedList 的构造方法:链表的构造方法接受一个单个元素作为参数,例如 LinkedList<Integer> list = new LinkedList<>(10);。这个构造方法会创建一个新的链表,其中的第一个元素被设置为10。如果你想要创建一个包含所有整数的链表,你可以使用以下构造方法:

      java LinkedList<Integer> list = new LinkedList<>(); list.add(1); list.add(2); list.add(3);

      1. 链表的删除元素:链表的删除元素通常通过修改链表的头节点来实现。以下是一个简单的示例:

      ```java LinkedList list = new LinkedList<>(); list.add(1); list.add(2); list.add(3);

      // 删除元素 list.remove(1);

      // 输出链表 System.out.println(list); // 输出:[2, 3] ```

      在这个示例中,我们首先调用了 list.remove(1) 方法来删除链表中的第一个元素,然后调用了 list.remove(1) 方法再次删除第二个元素,这样就删除了链表中的所有元素。

      1. LinkedList 的遍历:链表的遍历方式包括迭代器遍历、双向循环遍历和栈遍历。以下是一个使用迭代器遍历链表的示例:

      ```java LinkedList list = new LinkedList<>(); list.add(1); list.add(2); list.add(3);

      // 使用迭代器遍历 for (int i = 0; i < list.size(); i++) { System.out.println(list.get(i)); }

      // 使用双向循环遍历 LinkedList linkedList = new LinkedList<>(); LinkedList list2 = new LinkedList<>(); LinkedList list3 = new LinkedList<>(); LinkedList list4 = new LinkedList<>(); LinkedList list5 = new LinkedList<>();

      for (int i = 0; i < list.size(); i++) { linkedList.add(list.get(i)); }

      while (!linkedList.isEmpty()) { System.out.println(linkedList.remove()); }

      // 使用栈遍历 LinkedList stack = new LinkedList<>(); stack.push(1); stack.push(2); stack.push(3);

      while (!stack.isEmpty()) { System.out.println(stack.pop()); } ```

      在这个示例中,我们首先创建了一个链表,然后使用迭代器遍历了链表。我们使用 list.get(i) 方法来获取链表中的第 i 个元素,然后使用 LinkedList.remove(i) 方法删除了第 i 个元素,这样就遍历了整个链表。

      1. 链表的查找:链表的查找可以通过多种方法实现,包括直接查找、二分查找、哈希查找和迭代查找。以下是一个使用迭代查找链表的示例:

      ```java LinkedList list = new LinkedList<>(); list.add(1); list.add(2); list.add(3);

      // 使用迭代查找 for (int i = 0; i < list.size(); i++) { if (list.get(i) == 2) { System.out.println("找到了:" + list.get(i)); break; } }

      // 使用二分查找 int target = 2; LinkedList half = new LinkedList<>(); half.add(1); half.add(2); half.add(3);

      while (!half.isEmpty()) { int low = half.pollFirst(); int high = half.pollLast(); if (low <= target && target <= high) { System.out.println("找到了:" + target); break; } }

      // 使用哈希查找 int target = 2; LinkedList hashTable = new HashMap<>(); hashTable.put(1, "one"); hashTable.put(2, "two"); hashTable.put(3, "three");

      if (hashTable.containsKey(target)) { System.out.println("找到了:" + target); }

      // 使用迭代查找 for (int i = 0; i < list.size(); i++) { if (list.get(i) == target) { System.out.println("找到了:" + list.get(i)); break; } } ```

      在这个示例中,我们首先创建了一个链表,然后使用迭代查找了链表。我们使用 list.get(i) 方法来获取链表中的第 i 个元素,然后使用 hashTable.containsKey(target) 方法来检查链表中是否存在目标元素,如果存在,则输出元素和其索引。如果不存在,则输出“未找到”。

      1. 链表的优化:链表的性能通常取决于其大小和访问速度。为了优化链表的性能,可以考虑以下几种方法:

      2. 使用双向链表:双向链表中的每个节点都包含两个指针,一个指向前一个节点,另一个指向后一个节点。这样,访问链表的任何位置都只需要沿着链表的两个方向移动,速度更快。

      3. 使用链表推导式:链表推导式是一种特殊的迭代结构,它创建了一个新的链表,其中每个节点都包含链表的前一个节点和后一个节点。这种结构可以实现快速插入和删除元素,而不需要使用额外的指针。

      4. 使用平衡链表:平衡链表是一种特殊的链表,其中相邻的节点对齐。这种结构可以保证链表的长度保持恒定,而且插入和删除元素的速度比普通链表快。

      以上是一些关于链表的基本概念和实现方法,实际使用中,你可能需要根据具体的需求和场景选择合适的链表实现。例如,如果需要快速插入和删除元素,可以使用双向链表;如果需要高效查找元素,可以使用二分查找或哈希查找;如果需要保持链表的长度恒定,可以使用平衡链表。

    更多回答
    网站公告
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部