9.2链表(四)——以给定值x为基准将链表分割成两部分,所有小于x的结点排在大于或等于x的节点之前

/**
 * 功能:以给定值x为基准将链表分割成两部分,所有小于x的结点排在大于或等于x的节点之前。
 */

两种方法: 直接创建两个链表:一个链表存放小于x的元素,另一个存放大于或等于x的元素。

1、方法一:插入后端
      /*
       * 直接创建两个链表:一个链表存放小于x的元素,另一个存放大于或等于x的元素。
       * 然后迭代访问整个链表,将元素插入before或者after链表末尾。一旦抵达链表末端,则表明拆分完毕,最后合并两个链表。
       */
      
      public static LinkedListNode partition(LinkedListNode node, int x){
             if( node== null)
                   return null;
            
            LinkedListNode beforeStart= null;
            LinkedListNode beforeEnd= null;
            LinkedListNode afterStart= null;
            LinkedListNode afterEnd= null;
            
             while( node!= null){
                  LinkedListNode next= node. next; //将链表存储在next中
                   node. next= null;                            //将node的next清零表示,只是添加一个节点,而非以该节点为头结点的链表
                   if( node. data< x){
                         if( beforeStart== null){
                               beforeStart= node;
                               beforeEnd= beforeStart;
                        } else{
                               beforeEnd. next= node;
                               beforeEnd= node;
                        }
                  } else{
                         if( afterStart== null){
                               afterStart= node;
                               afterEnd= afterStart;
                        } else{
                               afterEnd. next= node;
                               afterEnd= node;
                        }
                  }
                   node= next;
            }
            
             if( beforeStart== null)
                   return afterStart;
            
             //合并
             beforeEnd. next= afterStart;
             return beforeStart;
      }

 2、方法二:插入前端
/*
       * 直接创建两个链表:一个链表存放小于x的元素,另一个存放大于或等于x的元素。
       * 然后迭代访问整个链表,将元素插入before或者after链表前端!!!一旦抵达链表末端,则表明拆分完毕,最后合并两个链表。
       */
      public static LinkedListNode partition2(LinkedListNode node, int x){
             if( node== null)
                   return null;
            
            LinkedListNode beforeStart= null;
            LinkedListNode afterStart= null;
            
             while( node!= null){
                  LinkedListNode next= node. next;
                   node. next= null;
                   if( node. data< x){
                         node. next= beforeStart;
                         beforeStart= node;
                  } else{
                         node. next= afterStart. next;
                         afterStart= node;
                  }
            }
            
             if( beforeStart== null)
                   return afterStart;
            
            LinkedListNode head= beforeStart;
             while( beforeStart. next!= null){
                   beforeStart= beforeStart. next;
            }
             beforeStart. next= afterStart;
            
             return head;
      }


版权声明:本文为shangqing1123原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。