双向链表的增删改查和反向遍历

双向链表:一个节点中既有上一个节点的内存地址又有下一个节点的内存地址,还有数据域

实现双向链表的增删改查:

首先:我们需要一个节点类来展示节点信息:

class HNode{
    public String name;
    public int no;//根据这个编号来查找,修改,删除,添加元素
    public HNode next;//下一个节点的信息
    public HNode pre;//上一个节点的信息

      public HNode(String name, int no) {
          this.name = name;
          this.no = no;
      }

      @Override
      public String toString() {
          return "姓名" +
                   name + '\'' +
                  "编号" + no
                  ;
      }
  }

接下来创建一个双向链表类来实现增删改查

class TwoWayLinkedList{
    HNode head=new HNode("",0);//定义一个空的头结点

接下来就是增删改操作了,关于实现的一些细节在代码注释里了

增,直接在末尾添加

 public void add(HNode newHNode){
        HNode temp=head;//头节点不能移动,用一个temp指针来遍历双向链表
        while(true)
        {
            if(temp.next==null)//找到了最后
        {
            break;
        }
            temp=temp.next;
        }
        temp.next=newHNode;//最后一个节点的下一个节点就是新加的节点
        newHNode.pre=temp;//新的节点的前一个节点就是temp
    }

增,按照no顺序添加

来张图可能更好理解一些
在这里插入图片描述

public void addByNo(HNode newHNode){
        HNode temp=head;
        boolean flag=false;//判断条件
        while(true)
        {
            if(temp.next==null)
            {
                break;
            }
            if(newHNode.no<temp.next.no)//找到位置了
            {
                break;
            }
            if(newHNode.no==temp.next.no)
            {
                flag=true;//如果编号重复就标记一下
                break;
            }
            temp=temp.next;
        }
        if(flag)
        {     System.out.println("编号重复,添加失败~~");
            }
        else{
            newHNode.next=temp.next;//新节点的下一个节点为temp的下一个节点
            temp.next=newHNode;//temp的下一个节点为新的节点,相当于中间插入了一个节点
        }

   }

//修改元素,通过no定位
public void modify(int no,String name){
HNode temp=head;
boolean flag=false;
if(temp.nextnull)
{
System.out.println(“链表已空修改失败”);
return;
}
while(true)
{
if(temp.no
no)
{
break;
}
if(temp.next==null){
flag=true;
break;
}
temp=temp.next;
}
if(flag){
System.out.println(“没有找到要修改的元素呢”);
}
else {
temp.name=name;
}

}

显示

 //显示元素
    public void show(){
        HNode temp=head;
        if(head.next==null)
        {
            System.out.println("链表为空!");
            return ;
        }
        while(true)
        {
            if(temp.next==null)
            {
                break;
            }
            System.out.println(temp.next);
            temp=temp.next;
        }
    }

    //从尾到头遍历
    public void showByReverse(){
        HNode temp=head;
        HNode  temp2;
        while(true)
        {
            if(temp.next==null)
            {
                temp2=temp;
                break;
            }
            temp=temp.next;

        }
        while(true)
        {
            if(temp2.pre==null)
            {
                break;
            }
            System.out.println(temp2);
            temp2=temp2.pre;
        }
    }

测试截图

增
按顺序添加
删
改

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
链表和双链表都是线性数据结构,它们的主要区别在于节点中链接信息的存储方式。以下是它们在增删改查操作中的时间复杂度区别: 1. 单链表: - **插入(增)**:在链表的头部插入节点,时间复杂度为 O(1),因为只需要改变头指针。在中间或尾部插入,需要找到目标位置并调整指针,时间复杂度为 O(n)。 - **删除(删)**:同样,在头结点删除是 O(1),其他位置删除需找到前一个节点,时间复杂度为 O(n)。 - **查找(查)**:从头开始遍历,直到找到或未找到,时间复杂度为 O(n)。 - **修改(改)**:同删除,需要找到目标节点后修改,时间复杂度为 O(n)。 2. 双链表: - **插入(增)**:在链表头部和尾部插入类似单链表,时间复杂度均为 O(1)。但在中间插入或删除,由于存在前驱和后继指针,操作更为直接,时间复杂度为 O(1)。 - **删除(删)**:无论是头部、尾部还是中间,都有前驱和后继节点,所以删除操作也比单链表快,时间复杂度为 O(1)。 - **查找(查)**:同单链表,时间复杂度为 O(n)。 - **修改(改)**:和删除一样,由于可以直接访问前驱和后继,时间复杂度为 O(1)。 总结来说,双链表在插入和删除操作上通常具有更好的性能,尤其是对于频繁在链表中间进行这些操作的情况。但在查找和修改操作上,两者并无太大差异,时间复杂度均为 O(n)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值