,但是无论队列是否为空 方法的最后都会设置firstNode=newNode, 所以为空的时候会设置lastNode=newNode; 在尾部添加新节点的道理也是这样;
双向链表:就是有双向指针,即双向的链域。链结点的结构:
┌────┬────┬────────┐
│ data │ next │ previous │
└────┴────┴────────┘
双向链表不必是双端链表(持有对最后一个链结点的引用),双端链表插入时是双向的。
有两条链:一条从头到尾,一条从尾到头,删除遍历时也是双向的。
/**
* 双向链表
*/
public class DoublyLinkedList<t>{
private Link<t>head //首结点
private Link<t>rear //尾部指针
public DoublyLinkedList() { }
public T peekHead() {
if (head != null) {
return head.data
}
return null
}
public boolean isEmpty() {
return head == null
}
public void insertFirst(T data) {// 插入 到 链头
Link<t>newLink = new Link<t>(data)
if (isEmpty()) {//为空时,第1次插入的新结点为尾结点
rear = newLink
} else {
head.previous = newLink//旧头结点的上结点等于新结点
}
newLink.next = head//新结点的下结点旧头结点
head = newLink//赋值后,头结点的下结点是旧头结点,上结点null
}
public void insertLast(T data) {//在链尾 插入
Link<t>newLink = new Link<t>(data)
if (isEmpty()) {
head = newLink
} else {
rear.next = newLink
}
newLink.previous = rear
rear = newLink//赋值后,尾结点的上结点是旧尾结点,下结点null
}
public T deleteHead() {//删除 链头
if (isEmpty()) return null
Link<t>temp = head
head = head.next//变更首结点,为下一结点
if (head != null) {
head.previous = null
} else {
rear = null
}
return temp.data
}
public T deleteRear() {//删除 链尾
if (isEmpty()) return null
Link<t>temp = rear
rear = rear.previous//变更尾结点,为上一结点
if (rear != null) {
rear.next = null
} else {
head = null
}
return temp.data
}
public T find(T t) {//从头到尾find
if (isEmpty()) {
return null
}
Link<t>find = head
while (find != null) {
if (!find.data.equals(t)) {
find = find.next
} else {
break
}
}
if (find == null) {
return null
}
return find.data
}
public T delete(T t) {
if (isEmpty()) {
return null
}
Link<t>current = head
while (!current.data.equals(t)) {
current = current.next
if (current == null) {
return null
}
}
if (current == head) {
head = head.next
if (head != null) {
head.previous = null
}
} else if (current == rear) {
rear = rear.previous
if (rear != null) {
rear.next = null
}
} else {
//中间的非两端的结点,要移除current
current.next.previous = current.previous
current.previous.next = current.next
}
return current.data
}
public boolean insertAfter(T key, T data) {//插入在key之后, key不存在return false
if (isEmpty()) {
return false
}
Link<t>current = head
while (!current.data.equals(key)) {
current = current.next
if (current == null) {
return false
}
}
Link<t>newLink = new Link<t>(data)
if (current == rear) {
rear = newLink
} else {
newLink.next = current.next
current.next.previous = newLink
}
current.next = newLink
newLink.previous = current
return true
}
public void displayList4Head() {//从头开始遍历
System.out.println("List (first-->last):")
Link<t>current = head
while (current != null) {
current.displayLink()
current = current.next
}
}
public void displayList4Rear() {//从尾开始遍历
System.out.println("List (last-->first):")
Link<t>current = rear
while (current != null) {
current.displayLink()
current = current.previous
}
}
class Link<t>{//链结点
T data//数据域
Link<t>next//后继指针,结点 链域
Link<t>previous//前驱指针,结点 链域
Link(T data) {
this.data = data
}
void displayLink() {
System.out.println("the data is " + data.toString())
}
}
public static void main(String[] args) {
DoublyLinkedList<integer>list = new DoublyLinkedList<integer>()
list.insertLast(1)
list.insertFirst(2)
list.insertLast(3)
list.insertFirst(4)
list.insertLast(5)
list.displayList4Head()
Integer deleteHead = list.deleteHead()
System.out.println("deleteHead:" + deleteHead)
list.displayList4Head()
Integer deleteRear = list.deleteRear()
System.out.println("deleteRear:" + deleteRear)
list.displayList4Rear()
System.out.println("find:" + list.find(6))
System.out.println("find:" + list.find(3))
System.out.println("delete find:" + list.delete(6))
System.out.println("delete find:" + list.delete(1))
list.displayList4Head()
System.out.println("----在指定key后插入----")
list.insertAfter(2, 8)
list.insertAfter(2, 9)
list.insertAfter(9, 10)
list.displayList4Head()
}
}
不知道还有多少服务端,只能说那些开花者太能干了
LavaBukkit是适用于1.12.2的Forge模组和Spigot模组的minecraft服务器实现,剩下的一堆优化。
原始阶段不建议使用。
与上文一模一样……除了是稳定版本。
群组服,比BongeeCord更好一点。随时保持更新。
Minecraft服务器历史上的一座里程碑。
优点:支持手机/Java双端共同游戏!!!在手机上享受Java服务端插件带来的乐趣。
缺点:并没有稳定版本。
最老的群组服。保持更新。
群组服,顾名思义就是链接多个服务器于一体,实现大型服务器。例如Hypixel,Mineplex,CubeCraft等国际知名服务器均使用群组服来运行整体(不一定用的Boungeecord)。子服使用任何服务端都可以,但需要端与端相互兼容,要不然穿梭的时候报错进不去。
二次元的服务端,据悉知好像是国人开花。版本为1.12.2,5个月没更新。
仅支持Craftbukkit/spigot/paperspigot插件
优点:多线程!服务器性能最大化!
缺点:没找到。
类似于GlowStone的开源服务端,支持1.12.2-1.14。
优点:多线程
缺点:不支持bukkit,sponge的api,开花状态
Cuberite是与Minecraft兼容的免费和开源(FOSS)游戏服务器。Cuberite在设计时充分考虑了性能,可配置性和可扩展性,并且还旨在准确地重现大多数原始功能。Cuberite用C ++编写,并且有一个广泛的插件系统,允许用户使用Lua编写自己的插件。实际上,许多内置命令都是由Core插件实现的,Core插件拥有自己的GitHub存储库和开发者社区。有关插件系统,如何使用以及如何开发的更多信息,请参见Plugins.(官网介绍,谷歌翻译制成)此服务端貌似可以在Android上运行。
全篇终,已故服务端不再介绍,没点用处。
Twitter:@HatsuyumeKagura
Google:[email protected]
Web Site: http://www.iloli.fun