package day01;
public class 双向链表 {
public static void main(String[] args) {
doubleLinklist dou = new doubleLinklist();
doubleLinkNode node1 = new doubleLinkNode(1);
doubleLinkNode node2 = new doubleLinkNode(2);
doubleLinkNode node3 = new doubleLinkNode(3);
doubleLinkNode node4 = new doubleLinkNode(4);
doubleLinkNode node5 = new doubleLinkNode(5);
doubleLinkNode node6 = new doubleLinkNode(6);
// 尾插法创建双链表测试
dou.add(node1);
dou.add(node2);
dou.add(node3);
dou.add(node4);
dou.add(node5);
dou.add(node6);
System.out.println("尾插法建立单链表");
dou.show();
// 统计双链表节点测试
System.out.println("有效节点个数:" + dou.tongji());
// 删除节点测试
dou.delete(2);
System.out.println("删除节点后的双链表");
dou.show();
// 查询节点测试
System.out.println("查询到的节点");
dou.select(2);
// 修改双链表测试
dou.update(2, 10);
System.out.println("修改后的链表");
dou.show();
}
}
class doubleLinklist {
// 创建一个头结点,
doubleLinkNode head = new doubleLinkNode(0);
// 尾插法创建双链表
public void add(doubleLinkNode Node) {
doubleLinkNode p = head;
while (true) {
if (p.next == null) {
break;
}
p = p.next;
}
p.next = Node;
Node.pre = p;
}
// 删除双链表,删除第i个,从1开始计数
public void delete(int i) {
int num = tongji();
if (num == 0) {
System.out.println("链表为空");
return;
} else if (i > num) {
System.out.println("超出范围");
return;
}
else if (i == 1 && num == 1) {
// 只有一个节点,直接删除
System.out.println("删除的节点是:" + head.next.num);
head.next = null;
return;
} else {
doubleLinkNode p = head.next;
int j = 1;
while (p != null) {
if (j == i) {
p.pre.next = p.next;
p.next.pre = p.pre;
break;
}
j++;
p = p.next;
}
}
}
public void update(int old,int xin){
int num = tongji();
if (num == 0) {
System.out.println("链表为空,无法修改");
return;
} else if (old > num) {
System.out.println("超出范围,无法修改");
return;
}
else {
doubleLinkNode p = head.next;
int j = 1;
while (p != null) {
if (j == old) {
p.num = xin;
break;
}
j++;
p = p.next;
}
}
}
public void select(int i) {
int num = tongji();
if (num == 0) {
System.out.println("链表为空");
return;
} else if (i > num) {
System.out.println("超出范围");
return;
}
else {
doubleLinkNode p = head.next;
int j = 1;
while (p != null) {
if (j == i) {
System.out.println(p.num);
break;
}
j++;
p = p.next;
}
}
}
// 统计节点个数
public int tongji() {
doubleLinkNode p = head.next;
int num = 0;
if (isempty() == true) {
return 0;
} else if (head.next.next == null) {
return 1;
}
while (p != null) {
num = num + 1;
p = p.next;
}
return num;
}
public void show() {
doubleLinkNode p = head.next;
if (p == null) {
System.out.println("双向链表是空的");
}
while (p != null) {
System.out.println(p.toString());
p = p.next;
}
}
// 判空
public boolean isempty() {
if (head.next == null) {
System.out.println("链表为空");
return true;
}
return false;
}
}
class doubleLinkNode {
public int num;
public doubleLinkNode next;
public doubleLinkNode pre;
public doubleLinkNode(int num) {
this.num = num;
}
@Override
public String toString() {
return num + "\t";
}
}
Java数据结构之双向链表的实现
最新推荐文章于 2021-02-16 12:51:43 发布