- 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 条
- 全部回答
-
じòぴé迩じòぴé莪 普通会员 1楼
链表是一种数据结构,其中每个节点包含一个数据元素(通常称为元素)和一个指向下一个节点的指针。在Java中,我们可以使用ArrayList、LinkedList和Stack等类来实现链表。以下是一些关于链表的小问题:
LinkedList的构造方法:链表的构造方法接受一个单个元素作为参数,例如LinkedList<Integer> list = new LinkedList<>(10);。这个构造方法会创建一个新的链表,其中的第一个元素被设置为10。如果你想要创建一个包含所有整数的链表,你可以使用以下构造方法:
java LinkedList<Integer> list = new LinkedList<>(); list.add(1); list.add(2); list.add(3);- 链表的删除元素:链表的删除元素通常通过修改链表的头节点来实现。以下是一个简单的示例:
```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)方法再次删除第二个元素,这样就删除了链表中的所有元素。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 个元素,这样就遍历了整个链表。- 链表的查找:链表的查找可以通过多种方法实现,包括直接查找、二分查找、哈希查找和迭代查找。以下是一个使用迭代查找链表的示例:
```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)方法来检查链表中是否存在目标元素,如果存在,则输出元素和其索引。如果不存在,则输出“未找到”。-
链表的优化:链表的性能通常取决于其大小和访问速度。为了优化链表的性能,可以考虑以下几种方法:
-
使用双向链表:双向链表中的每个节点都包含两个指针,一个指向前一个节点,另一个指向后一个节点。这样,访问链表的任何位置都只需要沿着链表的两个方向移动,速度更快。
-
使用链表推导式:链表推导式是一种特殊的迭代结构,它创建了一个新的链表,其中每个节点都包含链表的前一个节点和后一个节点。这种结构可以实现快速插入和删除元素,而不需要使用额外的指针。
-
使用平衡链表:平衡链表是一种特殊的链表,其中相邻的节点对齐。这种结构可以保证链表的长度保持恒定,而且插入和删除元素的速度比普通链表快。
以上是一些关于链表的基本概念和实现方法,实际使用中,你可能需要根据具体的需求和场景选择合适的链表实现。例如,如果需要快速插入和删除元素,可以使用双向链表;如果需要高效查找元素,可以使用二分查找或哈希查找;如果需要保持链表的长度恒定,可以使用平衡链表。
- 扫一扫访问手机版
回答动态

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器更新之后。服务器里面有部分玩家要重新创建角色是怎么回事啊?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题函数计算不同地域的是不能用内网吧?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题ARMS可以创建多个应用嘛?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题在ARMS如何申请加入公测呀?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题前端小程序接入这个arms具体是如何接入监控的,这个init方法在哪里进行添加?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器刚到期,是不是就不能再导出存档了呢?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器的游戏版本不兼容 尝试更新怎么解决?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器服务器升级以后 就链接不上了,怎么办?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器转移以后服务器进不去了,怎么解决?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器修改参数后游戏进入不了,是什么情况?预计能赚取 0积分收益
- 回到顶部
- 回到顶部

