Java:双端队列插入节点,关于队列为空时插入节点的疑问

Python016

Java:双端队列插入节点,关于队列为空时插入节点的疑问,第1张

队列为空的情况下 在首部添加新节点的时候,其实firstNode和lastNode相同都是newNode

,但是无论队列是否为空 方法的最后都会设置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