今天在自己的第一篇技术分享中介绍一下双向循环链表的java实现(图都是自己手画的,不太会用作图工具,丑也难免,属实不易【捂脸】)
1、单个结构
2、整体结构
看结构是不是一清二楚呀。。嘿嘿。那咱看代码看代码。
3、代码实现
public class PointerTest {
private static Pointer allPointer;
static class Pointer {
Pointer prior; //前一节点
Pointer next; //后一节点
int data; //数据
}
/**
* 初始化头节点
*/
private static void initPoint() {
allPointer = new Pointer();
allPointer.prior = allPointer;//前指针指向自己
allPointer.next = allPointer; //后指针指向自己
allPointer.data = Integer.MIN_VALUE;
}
/**
* 添加数据
*
* @param data
*/
private static void addData(int data) {
//创建数据为data的节点
Pointer pointer = new Pointer();
pointer.data = data;
//创建对象p指向头节点,当p的下一节点不是头节点的时候一直后移
Pointer p = allPointer;
while (p.next != allPointer) {
p = p.next;
}
//插入新节点(尾插法,p当前是指向最后一个节点
p.next = pointer;
pointer.prior = p;
pointer.next = allPointer;
allPointer.prior = pointer;
}
/**
* 删除链表中为data的数据
*
* @param data
*/
private static void delData(int data) {
Pointer p = allPointer;
while (p.next != allPointer) {
p = p.next;
if (p.data == data) {
p.prior.next = p.next;//将p的前节点的下一节点指向p的下一节点
p.next.prior = p.prior;//将p的下一节点的前一节点指向p的下一节点
}
}
}
/**
* 将链表中数据为before全部更新为after
*
* @param before
* @param after
*/
private static void updateData(int before, int after) {
Pointer p = allPointer;
while (p.next != allPointer) {
p = p.next;
if (p.data == before) {
p.data = after;
}
}
}
/**
* 遍历
*/
private static void printPoint() {
//正向向后遍历
Pointer pointer = allPointer.next;
while (pointer != allPointer) {
System.out.print(" " + pointer.data);
pointer = pointer.next;
}
System.out.println();
//反向向前遍历
Pointer p = allPointer.prior;
while (p != allPointer) {
System.out.print(" " + p.data);
p = p.prior;
}
System.out.println();
}
public static void main(String[] args) {
initPoint();
for (int i = 0; i < 122; i++) {
addData(i);
}
printPoint();
delData(111);
printPoint();
updateData(6, 888);
printPoint();
}
}