public class DoubleLinkedListTest {
public static void main(String[] args) {
//先创建几个节点
Node hero1 = new Node(1, "宋江", "及时雨");
Node hero2 = new Node(2, "卢俊义", "玉麒麟");
Node hero3 = new Node(3, "吴用", "智多星");
Node hero4 = new Node(4, "林冲", "豹子头");
Node newHero = new Node(2, "水", "浒");
//创建一个链表
DoubleLinkedList DoubleLinkedList = new DoubleLinkedList();
//1-增
DoubleLinkedList.addNode(hero1);
DoubleLinkedList.addNode(hero2);
DoubleLinkedList.addNode(hero3);
DoubleLinkedList.addNode(hero4);
//2-删
DoubleLinkedList.del(3);
//3-改
//修改数据
DoubleLinkedList.newNode(newHero);
//4-查
//显示链表
DoubleLinkedList.list();
}
}
class DoubleLinkedList {
//初始化一个头节点
private Node head = new Node(0, "", "");
//返回头节点
//判断链表是否为空
public void isEmpty() {
if (head.next == null) {
System.out.println("链表为空,无法删除!");
return;
}
}
/*
* 在双向链表中添加新节点,--在双向链表最后添加一个新的节点
* 思路:不考虑编号顺序时
* 1.找到当前链表的最后一个节点
* 2.找到最后节点的next指向新节点,新节点的pre指向原来最后一个节点的pre
*/
public void addNode(Node node) {
//因为头节点不能移动,所以弄一个辅助变量temp
Node temp = head;
//遍历链表找到最后
while (true) {
if (temp.next == null) {
break; //找到了
}
//如果没有找到,temp后移
temp = temp.next;
}
//当while循环结束以后,temp指向了最后一个节点
//将最后一个节点指向新的节点
// 形成一个双向链表
temp.next = node;
node.pre = temp;
}
//修改节点的信息,根据新节点的no来修改,即no值不变
//与单链表方法相同
public void newNode(Node newNode) {
//先判断链表是否为空
if (head.next == null) {
System.out.println("链表为空");
return;
}
//定义一个辅助变量
Node temp = head.next;
boolean flag = false; //是否找到要修改节点
while (true) {
if (temp == null) {
break; //已经遍历完列表了
}
if (newNode.no == temp.no) {
flag = true;
break;
}
temp = temp.next;
}
if (flag) {
temp.name = newNode.name;
temp.nickName = newNode.nickName;
} else {
//没有找到
System.out.printf("修改数据编号%d,没有找到,不能修改", newNode.no);
}
}
/*
* 从双向链表删除要删除节点
*思路:
*1-对于双向链表,我们可以直接找到要删除的节点
*2-找到后进行自我删除
*/
public void del(int no) {
//判断当前 链表是否为空链表
this.isEmpty();
//辅助节点
Node temp = head.next;
boolean flag = false; //是否找到要删除节点
while (true) {
if (temp == null) {
//已经找到链表最后
break;
}
if (temp.no == no) {
flag = true;
break;
}
temp = temp.next;
}
if (flag) {
//找到,删除
temp.pre.next = temp.next;
//删除最后一个点的话会出现空指针
if (temp.next != null) {
temp.next.pre = temp.pre.pre;
}
} else {
System.out.printf("没有找到要删除编号 %d 的数据",no);
}
}
//显示遍历链表
public void list() {
//判断链表是否为空
// if (head.next == null) {
// System.out.println("链表为空");
// }
this.isEmpty();
//因为头节点不能动,我们需要一个辅助变量来遍历
Node temp = head.next;
//遍历链表找到最后
while (true) {
if (temp == null) {
break; //找到了
}
//输出节点信息
System.out.println(temp);
//如果没有找到,temp后移
temp = temp.next;
}
}
}
class Node {
public int no;
public String name;
public String nickName;
public Node next; //指向下一个节点,默认null
public Node pre; //指向上一个节点,默认null
//构造器
public Node(int no, String name, String nickName) {
this.no = no;
this.name = name;
this.nickName = nickName;
}
//显示
@Override
public String toString() {
return "HeroNode [no=" + no + ", name = " + name + ", nickname=" + nickName + "]";
}
}
Java数据结构 | 双链表的代码实现
最新推荐文章于 2024-05-28 21:51:03 发布