单链表的反转(开辟新的空间和不开辟额外的空间)

利用新链表:

思路:

         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;
    }
原文地址:https://www.cnblogs.com/128-cdy/p/12197869.html