zoukankan      html  css  js  c++  java
  • 单向链表和双向链表

    一、链表是什么?

    单向链表Linked List:是一种在物理上非连续、非顺序的数据结构,由若干节点(node)所组成。

      而节点包括两部分,一部分是存放数据的变量data,另一部分是指向下一个节点的指针next

       链表的第1个节点被称为头节点,最后1个节点被称为尾节点尾节点的next指针指向空

       

    注意:链表分为带头节点的链表 和 没有头节点的链表。头节点不存放数据内容。

       数组是连续存储的,而链表的各个节点不一定是连续存储。

       数组能根据下标随机访问,而链表只能从头节点开始通过一级一级的节点去寻找。

       数组在内存中的存储方式是顺序存储,链表在内存中的存储方式则是随机存储。

       

    二、单向链表的基本操作

    链表在查找节点在查,链表不像数组那样可以通过下标快速进行定位,只能从头节点开始向后一个一个节点逐一查找(遍历)。--辅助指针

    //增加节点
      //头部插入---中间插入---尾部插入
      //头部插入和尾部插入---改变next属性指向插入节点
      //中间插入---使得 插入位置的上一个元素的节点 指向 插入元素,而插入元素的 next 属性指向上一个元素原本的下一个节点--利用辅助指针

          HeroNode temp = head; //创建--辅助指针
          boolean flag = false; //flag标志添加的编号是否存在,默认false
          while(true) {
            if(temp.next == null) { //当为链表末端时,
              break;
            }
            if(temp.next.no > node.no) {
              break; //这里是遵循序号规则大小排序位置找到
            }else if(temp.next.no == node.no) {
              flag = true; //编号存在
              break;
            }
          temp = temp.next; //继续遍历洗下一个元素
          }//--循环结束
          //判断flag的值
          if(flag) {
            System.out.println("准备插入的编号已经存在");
          }else {
          //插入链表,temp的后面
            node.next = temp.next;
            temp.next = node;
          }

    //删除节点--节点无法自我删除
      //利用 辅助指针 找到要删除元素的上一个位置,改变其next属性,指向该next属性的下一个next

        public void del(int index) {
          //创建辅助指针
        HeroNode temp = head;
        boolean flag = false; //判断是否存在该节点
        while(true) {
          if(temp.next == null) {
             System.out.println("该链表为空");
            break;
           }
          if(index == temp.next.no) {
            flag = true;
            break;
           }
        temp = temp.next;
        }

        //判断是否要删除节点

        if(flag) {
          temp.next = temp.next.next;//使得要删除节点的上一个节点的next属性指向,下下个元素。
        }else {
          System.out.printf("要删除的%d节点不存在 ",index );
          }
        }

    //修改节点
      //找到要修改的节点

      public void updateNode(HeroNode node) {
        //创建辅助指针
        HeroNode temp = head;
        boolean flag = false;//表示是否找到节点
        while(true) {
          if(temp == null) {
            break;//遍历完节点
          }
          if(temp.no == node.no) {
            flag = true;
            break;
          }
        temp = temp.next;//遍历下一个元素
        }
        //根据flag值判断是否修改节点
        if(flag) {
          temp.name = node.name;
          temp.nickname = node.nickname;
        }else {
        System.out.println("没有找到要修改的编号节点");
          }
        }

     三、双向链表

    双向链表:双向链表比单向链表稍微复杂一些,它的每一个节点除了拥有 data 和 next 指针,还拥有指向前置节点的 prev 指针。

    管理单向链表的缺点分析:

    1). 单向链表,查找的方向只能是一个方向,而双向链表可以向前或者向后查找

    2). 单向链表不能自我删除,需要靠辅助节点,而双向链表,则可以自我删除,所以前面我们单链表删除时节点,总是找到temp,temp是待删除节点的前一个节点(认真体会)

       

    双向链表的操作:

    删除:

    增加、更新:

    修改:

    //双向链表的查抄--和单向链表相同,不过能双向
    
    //双向链表的增加--默认添加到双向链表的最后
        //(1)先找到双向链表的最后这个节点        
        //(2)temp.next=newHeroNode   末尾节点指向插入节点
        //(3)newHeroNode.pre=temp;    插入节点的pre属性指向上一个节点
        链表头节点增加----
            temp.pre.next=temp.next
            temp.next.pre=temp.pre;        
  • 相关阅读:
    第三个冲刺周期第1天
    第二个冲刺周期第7天
    第二个冲刺周期第6天
    第二个冲刺周期第5天
    电梯调度系统最终版
    电梯调度系统迟真真&冯小兰
    软件工程之课程评价czz
    《代码大全2》读后感czz
    迟真真假如历史可以重来
    十天冲刺任务迟真真
  • 原文地址:https://www.cnblogs.com/Tanggula-pioneer/p/11825745.html
Copyright © 2011-2022 走看看