zoukankan      html  css  js  c++  java
  • 单链表的反转(开辟新的空间和不开辟额外的空间)

    利用新链表:

    思路:

             1.定义一个新的链表;

             2.从头到尾遍历原来的链表,每遍历一个节点,将其取出,并且将其放在新的链表的最前端,也就是第一个有效结点;

             3.将原来的链表的head.next = 新的链表的head.next。

     主要代码:

    public  void reverSetList(){
          //如果链表为空或者链表只有一个元素,无需反转
          if(this.head.next == null || this.head.next.next == null){
              return;
          }
          //定义一个辅助变量,遍历原来的链表
          Node index = this.head.next;
          Node cur = null;  //指向当前节点[index]的下一个节点
          Node reverHead = new Node<E>((E)new Object(),null); //定义一个新的节点
          //遍历原来的链表
          while (index != null){
              cur = index.next;//暂时保存当前节点的下一个节点
              index.next = reverHead.next;  //将index的下一个节点指向新链表的最前端
              reverHead.next = index;
              index = cur; //index后移
          }
          this.head.next = reverHead.next;   //原来链表指向新的节点的最前端
      }

    利用原链表:

    定义三个指针(一个标记每次逆序的链表的头,一个作为基准,另一个作为下次要逆序的值)

    假如要逆序的链表如下图:

     其主要过程:

          分析上图:经过第一步将数据1与数据2之间的联系断开,与数据三建立联系,第二步将数据2与数据3之间的联系断开,与数据1建立联系,并且将头结点指向p1,也就是更新head。重复上面操作,直到p1指向null。

    具体代码如下:

    /**
         * 逆置单链表
         * @param node  链表头结点
         */
        public static Node inversion(Node node){
            if(node == null){   //此处应该加入判断只有一个节点的情况,也不需要反转
                System.out.println("Linked is empty");
            }
            Node head = node;  //头指针
            Node p = node;  //固定指针
            Node p1 = node.next;   //后指针
            while (p1 != null){
                p.next = p1.next;
                p1.next = head;
                head = p1;
                p1 = p.next;
            }
            return head;
        }
  • 相关阅读:
    Django与forms组件校验源码
    局部钩子和和全局钩子
    Form组件参数配置
    Form渲染错误信息
    Django与分页器
    Django与from组件
    uiautomatorview 提示:no android devies were detected by adb
    Flutter 应用入门:包管理
    Flutter 应用入门:路由管理
    Flutter 应用入门:计数器
  • 原文地址:https://www.cnblogs.com/128-cdy/p/12197869.html
Copyright © 2011-2022 走看看