mysql 双向链表_双向链表

双向链表

56f891d6a4a2c7f056cd1eb24acd6038.png

相比单链表,节点多了一个pre指向前一个节点的地址

添加节点

思路

遍历方和单链表-样,只是可以向前,也可以向后查找

添加(默认添加到双向链表的最后)

先找到双向链表的最后这个节点

temp.next =newHeroNode

newHeroNode.pre =temp;

//添加一个节点(有序)

public void addByOrder(HeroNode2 heroNode2){

boolean flag = false;

HeroNode2 temp = head;

while (temp.next!=null){

if (temp.next.no>heroNode2.no){

break;

}else if (temp.next.no==heroNode2.no){

flag = true;

break;

}

temp=temp.next;

}

if (flag){

System.out.println("要添加的节点编号已存在");

}else {

if (temp.next!=null){

temp.next.pre = heroNode2;

heroNode2.next = temp.next;

}

temp.next = heroNode2;

heroNode2.pre = temp;

}

}

删除节点

46bfa68adbe62cd96f86b8dc5af25e49.png

删除

因为是双向链表,因此,我们可以实现自我删除某个节点

直接找到要删除的这个节点,比如temp

temp.pre.next = temp.next

temp.next.pre = temp.pre

//删除

public void del(int no){

if (head.next==null){

System.out.println("链表为空");

return;

}

HeroNode2 temp = head.next;

boolean flag = false;

while (temp!=null){

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 void list(){

if (head.next==null){

System.out.println("链表为空");

}

//头节点是空的,不需要遍历,所以temp直接指向temp.next,即第一个节点

HeroNode2 temp=head.next;

while (true){

if (temp==null){

break;

}

System.out.println(temp);

temp=temp.next;

}

}

修改双向链表节点信息

同单链表

//修改一个节点

public void update (HeroNode2 heroNode2){

if (heroNode2==null){

return;

}

boolean flag=false;//表示节点是否存在

HeroNode2 temp = head.next;

while (temp!=null){

if (temp.no == heroNode2.no ){

flag = true;

break;

}

if (temp.no > heroNode2.no){

break;

}

temp = temp.next;

}

if (flag){

temp.name = heroNode2.name;

temp.nickName = heroNode2.nickName;

}else {

System.out.println("你要修改的节点不存在");

}

}

代码实现(水浒英雄排行)

package Linked;

public class DoubleLinkedListDemo {

public static void main(String[] args) {

HeroNode2 hero1 = new HeroNode2(1, "松江", "及时雨");

HeroNode2 hero2 = new HeroNode2(2, "卢俊义", "玉麒麟");

HeroNode2 hero3 = new HeroNode2(3, "吴用", "智多星");

HeroNode2 hero4 = new HeroNode2(4, "林冲", "豹子头");

DoubleLinkedList doubleLinkedList = new DoubleLinkedList();

// doubleLinkedList.add(hero2);

// doubleLinkedList.add(hero3);

// doubleLinkedList.add(hero1);

// doubleLinkedList.add(hero4);

doubleLinkedList.addByOrder(hero2);

doubleLinkedList.addByOrder(hero3);

doubleLinkedList.addByOrder(hero1);

doubleLinkedList.addByOrder(hero4);

doubleLinkedList.list();

System.out.println("修改一个节点后");

HeroNode2 updateNode = new HeroNode2(4, "冲淋", "狮子头");

doubleLinkedList.update(updateNode);

doubleLinkedList.list();

System.out.println("删除一个节点后");

doubleLinkedList.del(1);

doubleLinkedList.list();

}

}

//创建一个双向链表

class DoubleLinkedList{

//创建一个空链表头

private HeroNode2 head=new HeroNode2(0,"","");

//返回head的节点

public HeroNode2 getHead() {

return head;

}

//遍历双向链表

public void list(){

if (head.next==null){

System.out.println("链表为空");

}

//头节点是空的,不需要遍历,所以temp直接指向temp.next,即第一个节点

HeroNode2 temp=head.next;

while (true){

if (temp==null){

break;

}

System.out.println(temp);

temp=temp.next;

}

}

//添加一个节点

public void add(HeroNode2 heroNode2){

HeroNode2 temp = head;

while (temp.next!=null){

temp = temp.next;

}

temp.next = heroNode2;

heroNode2.pre = temp;

}

//添加一个节点(有序)

public void addByOrder(HeroNode2 heroNode2){

boolean flag = false;

HeroNode2 temp = head;

while (temp.next!=null){

if (temp.next.no>heroNode2.no){

break;

}else if (temp.next.no==heroNode2.no){

flag = true;

break;

}

temp=temp.next;

}

if (flag){

System.out.println("要添加的节点编号已存在");

}else {

if (temp.next!=null){

temp.next.pre = heroNode2;

heroNode2.next = temp.next;

}

temp.next = heroNode2;

heroNode2.pre = temp;

}

}

//修改一个节点

public void update (HeroNode2 heroNode2){

if (heroNode2==null){

return;

}

boolean flag=false;//表示节点是否存在

HeroNode2 temp = head.next;

while (temp!=null){

if (temp.no == heroNode2.no ){

flag = true;

break;

}

if (temp.no > heroNode2.no){

break;

}

temp = temp.next;

}

if (flag){

temp.name = heroNode2.name;

temp.nickName = heroNode2.nickName;

}else {

System.out.println("你要修改的节点不存在");

}

}

//删除

public void del(int no){

if (head.next==null){

System.out.println("链表为空");

return;

}

HeroNode2 temp = head.next;

boolean flag = false;

while (temp!=null){

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;

}

}

}

}

class HeroNode2{

public int no;

public String name;

public String nickName;

public HeroNode2 next;

public HeroNode2 pre;

public HeroNode2(int no, String name, String nickName) {

this.no = no;

this.name = name;

this.nickName = nickName;

}

@Override

public String toString() {

return "HeroNode2{" +

"no=" + no +

", name='" + name + '\'' +

", nickName='" + nickName + '\'' +

'}';

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值