我是靠谱客的博主 健忘大炮,最近开发中收集的这篇文章主要介绍双向链表的实现(插入,删除,修改,遍历)双向链表遍历双向链表无序添加双向链表顺序添加双向链表修改双向链表删除,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

目录

双向链表遍历

思路

代码

双向链表无序添加

思路

代码

双向链表顺序添加

思路

代码

双向链表修改

思路

代码

双向链表删除

思路

代码


双向链表遍历

思路

与单链表思路一样

代码

public void list() {
// 判断链表是否为空
if (head.next == null) {
System.out.println("链表为空");
return;
}
// 因为头节点,不能动,因此我们需要一个辅助变量来遍历
HeroNode2 temp = head.next;
while (true) {
// 判断是否到链表最后
if (temp == null) {
break;
}
// 输出节点的信息
System.out.println(temp);
// 将temp后移, 一定小心
temp = temp.next;
}
}

双向链表无序添加

思路

比单链表的操作多一个pre指针指向最后一个结点,即新节点的前指针指向最后一个结点。

代码

// 添加一个节点到双向链表的最后.
public void add(HeroNode2 heroNode) {
​
// 因为head节点不能动,因此我们需要一个辅助遍历 temp
HeroNode2 temp = head;
// 遍历链表,找到最后
while (true) {
// 找到链表的最后
if (temp.next == null) {//
break;
}
// 如果没有找到最后, 将temp后移
temp = temp.next;
}
// 当退出while循环时,temp就指向了链表的最后
// 形成一个双向链表
temp.next = heroNode;
heroNode.pre = temp;
}

双向链表顺序添加

思路

  1. 需注意添加第一个结点时,temp.next(即head.next)为null,会出现空指针异常

  2. 添加之后的结点,首先新节点的尾部,指向比自己首次大的结点 heroNode.next=temp.next;

  3. 比自己首次大的结点的前指针指向自己 temp.next.pre=heroNode;

  4. temp指向的结点指向新节点temp.next=heroNode;

  5. 新节点的前指针指向指向的结点tempheroNode.pre=temp;

代码

public void addByOrder(HeroNode2 heroNode) {
       //因为头节点不能动,因此我们仍然通过一个辅助指针(变量)来帮助找到添加的位置
       //因为单链表,因为我们找的temp 是位于 添加位置的前一个节点,否则插入不了
       HeroNode2 temp = head;
       boolean flag = false; // flag标志添加的编号是否存在,默认为false
       while(true) {
           if(temp.next == null) {//说明temp已经在链表的最后
               break; //
         
}
           if(temp.next.no > heroNode.no) { //位置找到,就在temp的后面插入
               break;
         
} else if (temp.next.no == heroNode.no) {//说明希望添加的heroNode的编号已然存在
​
               flag = true; //说明编号存在
               break;
         
}
           temp = temp.next; //后移,遍历当前链表
     
}
       //判断flag 的值
       if(flag) { //不能添加,说明编号存在
           System.out.printf("准备插入的英雄的编号 %d 已经存在了, 不能加入n", heroNode.no);
     
} else {
           //插入到链表中, temp的后面
           if (temp.next!=null){
               heroNode.next=temp.next;
               temp.next.pre=heroNode;
               temp.next=heroNode;
               heroNode.pre=temp;
         
}else{
               temp.next = heroNode;
               heroNode.pre = temp;
         
}
     
}
 
}

双向链表修改

思路

和单链表思路相同

代码

public void update(HeroNode2 newHeroNode) {
// 判断是否空
if (head.next == null) {
System.out.println("链表为空~");
return;
}
// 找到需要修改的节点, 根据no编号
// 定义一个辅助变量
HeroNode2 temp = head.next;
boolean flag = false; // 表示是否找到该节点
while (true) {
if (temp == null) {
break; // 已经遍历完链表
}
if (temp.no == newHeroNode.no) {
// 找到
flag = true;
break;
}
temp = temp.next;
}
// 根据flag 判断是否找到要修改的节点
if (flag) {
temp.name = newHeroNode.name;
temp.nickname = newHeroNode.nickname;
} else { // 没有找到
System.out.printf("没有找到 编号 %d 的节点,不能修改n", newHeroNode.no);
}
}

双向链表删除

思路

  1. 首先找到要删除的结点,与单链表不同的是,单链表的辅助指针temp指向要删除的结点的前一个结点;

    而双向链表的辅助指针temp指向要删除的结点本身

  2. temp.pre.next = temp.next;要删除的结点的前一个结点指向要删除的结点的后一个结点

  3. 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 (true) {
if (temp == null) { // 已经到链表的最后
break;
}
if (temp.no == no) {
// 找到的待删除节点的前一个节点temp
flag = true;
break;
}
temp = temp.next; // temp后移,遍历
}
// 判断flag
if (flag) { // 找到
// 可以删除
// temp.next = temp.next.next;[单向链表]
temp.pre.next = temp.next;
// 如果是最后一个节点,就不需要执行下面这句话,否则出现空指针
if (temp.next != null) {
temp.next.pre = temp.pre;
}
} else {
System.out.printf("要删除的 %d 节点不存在n", no);
}
}

最后

以上就是健忘大炮为你收集整理的双向链表的实现(插入,删除,修改,遍历)双向链表遍历双向链表无序添加双向链表顺序添加双向链表修改双向链表删除的全部内容,希望文章能够帮你解决双向链表的实现(插入,删除,修改,遍历)双向链表遍历双向链表无序添加双向链表顺序添加双向链表修改双向链表删除所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(40)

评论列表共有 0 条评论

立即
投稿
返回
顶部