public class DoubleLinkedList {
private User2 head = new User2(0, "");
public User2 getHead() {
return head;
}
/**
* 默认排序添加思路:
* 1.找到当前链表的最后节点。
* 2.将最后节点的next指向新的节点
* 3.将新节点的pre指向temp
*/
public void add(User2 user) {
//因为head节点不可以动,因此需要创建一个辅助节点
User2 temp = head;
//循环查找。找到链表的最后
while (true) {
//找到链表的最后
if (temp.next == null) {
break;
}
//如果没有找到最后,将temp后移
temp = temp.next;
}
//把新的节点指向链表最后
temp.next = user;
//把新节点的上一个指针指向temp
user.pre = temp;
}
/**
* 修改节点思路:
* 1.找到和新节点相同ID的节点。 temp.id == 新节点.id
* 2.更改姓名 temp.name = 新节点.name;
*/
//修改节点信息。根据人物ID修改人物名称。
public void update(User2 newUser) {
//判空
if (head.next == null) {
System.out.println("链表为空。无法修改");
return;
}
//找到需要修改的节点,根据人物ID
//因为头节点不能动。所以定义一个辅助节点
User2 temp = head.next;
while (true) {
if (temp == null) {
break;
}
//如果找到则直接修改名字
if (temp.id == newUser.id) {
temp.name = newUser.name;
return;
}
//temp后移实现遍历
temp = temp.next;
}
System.out.printf("没有找到ID为%d的节点,无法修改", newUser.id);
}
/**
* 删除节点思路:(根据人物ID来删除)
* 1.先找到要删除的节点temp
* 2.temp的上一个节点next直接指向temp的下一个节点
* 3.temp的下一个节点pre直接指向temp的上一个节点
* 4.被删除的节点,将不会有其他引用指向,会被垃圾回收机制回收。
*/
public void delete(int id) {
//判断当前列表是否为空
if (head.next == null) {
System.out.println("链表为空无法删除");
return;
}
//辅助指针。
User2 temp = head.next;
while (true) {
//已经到链表的最后
if (temp == null) {
break;
}
//找到了待删除的节点
if (temp.id == id) {
//temp的上一个节点next直接指向temp的下一个节点
temp.pre.next = temp.next;
//temp的下一个节点pre直接指向temp的上一个节点
//如果是最后一个节点就不需要执行下面这句话。否则会空指针异常。
if (temp.next!=null){
temp.next.pre = temp.pre;
}
return;
}
//temp后移实现遍历
temp = temp.next;
}
System.out.printf("要删除的节点%d不存在", id);
}
/**
* 按照ID排序添加思路:
* 1.通过遍历找到新添加的节点的位置,
* 2.把新的节点.next 指向 temp.next
* 3.把temp.next.pro节点指向新的节点。
* 4.把新的节点.pre指向temp
* 5.把temp.next指向新的节点。
*/
public void addByOrder(User2 user) {
//因为头节点不能动。因此需要通过一个辅助指针来帮助查找添加的位置。
//我们找的temp应该是位于添加位置的前一个节点。否则无法插入。
User2 temp = head;
while (true) {
//如果为null说明已经到最后了。这时候直接插入就可以了。
if (temp.next == null) {
break;
}
//如果当前节点的下一个节点的ID比新节点的ID大,则表示找到(新节点在这两个中间插入。)
if (temp.next.id > user.id) {
break;
} else if (temp.next.id == user.id) {
//如果编号存在 直接返回。不做插入操作
System.out.printf("编号%d存在了。无法添加。", user.id);
return;
}
temp = temp.next;
}
//.把新的节点.next 指向 temp.next
user.next = temp.next;
if (temp.next!=null) temp.next.pre = user;
user.pre = temp;
temp.next = user;
//把temp.next指向新的节点。
}
//遍历双向链表的方法
public void showList() {
//判断当前链表是否为空
if (head.next == null) {
System.out.println("链表为空");
return;
}
//因为头节点不能动。因此需要一个辅助节点。
User2 temp = head.next;
while (true) {
//判断是否到最后
if (temp == null) {
break;
}
//输出节点信息
System.out.println(temp);
//temp后移实现遍历
temp = temp.next;
}
}
}
class User2 {
public int id;
public String name;
public User2 next;
public User2 pre;
public User2(int id, String name) {
this.id = id;
this.name = name;
}
@Override
public String toString() {
return "User2{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
}
class DoubleLinkedListDemo{
public static void main(String[] args) {
User2 user = new User2(1, "张三");
User2 user1 = new User2(2, "李四");
User2 user2 = new User2(3, "王五");
User2 user3 = new User2(4, "赵六");
DoubleLinkedList list = new DoubleLinkedList();
list.add(user);
list.add(user1);
list.add(user2);
list.add(user3);
list.showList();
//修改
User2 newUser = new User2(1, "修改后的张三");
list.update(newUser);
System.out.println("修改后的链表");
list.showList();
//删除
list.delete(3);
System.out.println("删除后的链表");
list.showList();
DoubleLinkedList list2 = new DoubleLinkedList();
list2.addByOrder(user3);
list2.addByOrder(user1);
list2.addByOrder(user2);
list2.addByOrder(user);
list2.showList();
}
}
数据结构:双向链表的增删改查思路和代码实现
最新推荐文章于 2023-02-25 20:47:57 发布