单向链表缺点分析
- 单向链表,查找的方向只能是一个方向,而双向链表可以向前或向后
- 单向链表不能自我删除,需要靠辅助节点,而双向链表可以自我删除
双向链表增删改查思路
- 遍历方式和单向链表一样,只是可以向前也可以向后查询
- 添加(默认添加到双向链表的最后)
先找到双向链表的最后这个节点
temp.next = newHero
newHero.pre = temp
- 修改和单向链表一样
- 删除
可以实现自我删除某个节点
直接找到要删除这个节点,比如temp
temp.pre.next = temp.next
temp.next.pre = temp.pre
class Hero {
public Integer no;
public String name;
public Hero next;//后继
public Hero pre;//前驱
public Hero(Integer no, String name) {
this.no = no;
this.name = name;
}
@Override
public String toString() {
return "Hero{" +
"no=" + no +
", name='" + name + '\'' +
'}';
}
}
class DoubleLinked {
private Hero head = new Hero(0, "");
public Hero getHead() {
return head;
}
//遍历双向链表
public void list() {
if (head.next == null) {
System.out.println("链表为空");
return;
}
Hero temp = head.next;
while (true) {
if (temp == null) {
break;
}
System.out.println(temp);
temp = temp.next;
}
}
//顺序编号
public void addOrder(Hero hero){
Hero temp = head;
while (true){
if(temp.next == null){
temp.next = hero;
hero.pre = temp;
break;
}
if(temp.no < hero.no && temp.next.no > hero.no){
Hero oldTempNext = temp.next;//保存下一个节点
oldTempNext.pre = hero;
hero.next = oldTempNext;
temp.next = hero;
hero.pre = temp;
break;
}
if(temp.no == hero.no){
System.out.println("此链表有序号");
return;
}
temp = temp.next;
}
}
//添加
public void add(Hero hero) {
Hero temp = head;
while (true) {
/*找到链表最后为止*/
if (temp.next == null) {
break;
}
temp = temp.next;
}
/*形成双向链表*/
temp.next = hero;
hero.pre = temp;
}
//修改
public void update(Hero hero) {
Hero temp = head.next;
boolean flag = false;
while (true) {
if (temp == null) {
break;//已经遍历完
}
if (temp.no == hero.no) {
flag = true;
break;
}
temp = temp.next;
}
if (flag) {
temp.name = hero.name;
} else {
System.out.println("没有找到");
}
}
//删除
public void delete(int no) {
if (head.next == null) {
System.out.println("队列为空");
return;
}
Hero 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;
}
}
}
}
public class DoubleLinkedDemo {
public static void main(String[] args) {
Hero x= new Hero(93, "x");
Hero y= new Hero(33, "y");
Hero z= new Hero(45, "z");
DoubleLinked doubleLinked = new DoubleLinked();
doubleLinked.addOrder(x);
doubleLinked.addOrder(y);
doubleLinked.addOrder(z);
doubleLinked.list();
}
}