面试题目:链表的分化练习题

题目:

对于一个链表,我们需要用一个特定阈值完成对它的分化,使得小于等于这个值的结点移到前面,大于该值的结点在后面,同时保证两类结点内部的位置关系不变。

给定一个链表的头结点head,同时给定阈值val,请返回一个链表,使小于等于它的结点在前,大于等于它的在后,保证结点值不重复。

测试样例:
{1,4,2,5},3
{1,2,4,5}

 

 

class Divide {
public:
    ListNode* listDivide(ListNode* head, int val) {
// write code here
    ListNode *lhead=new ListNode(-1);   //按原链表顺序遍历   并将小于等于val值 存在lhead为结点的新链表
    ListNode *rhead=new ListNode(-1);  //                             将大于val值 存在rhead为结点的新链表
    auto p=head;
    auto left=lhead;
    auto right=rhead;

    //以下是遍历&分类的过程
    while(p!=NULL){
       if(p->val<=val){
         left->next=p;
         left=p;
       } 
       else{
         right->next=p;
         right=p;
       }
       p=p->next;
   }


   left->next=NULL;     //新链表的尾部->NULL
   right->next=NULL;

   /*如果lhead链表没有值插入 我们就返回rhead

   /  如果有那么就返回lhead 

   */

   if(lhead->next==NULL){
      rhead=rhead->next;
      return rhead;
   }
   else{
     lhead=lhead->next;
     rhead=rhead->next;
     left->next=rhead;
     return lhead;
   }


   }
};

posted @ 2016-08-23 22:40  scrooge  阅读(144)  评论(0)    收藏  举报