现有一链表的头指针 ListNode* pHead,给一定值x,编写一段代码将所有小于x的结点排在其余结点之前,且不能改变原来的数据顺序,返回重新排列后的链表的头指针。

思路,把链表分成两个新链表,然后连接起来
在这里插入图片描述
代码:

class Partition {
public:
    ListNode* partition(ListNode* pHead, int x) {
        // write code here
        if(pHead==NULL)
        {
            return pHead;
        }
         ListNode* ghead=NULL;
         ListNode* gtail=NULL;
         ListNode* lhead=NULL;
         ListNode* ltail=NULL;
         ListNode* cur=pHead;
         while(cur)
         {
            if(cur->val<x)
            {
                if(ltail==NULL)
                {
                    lhead=ltail=cur;
                }else 
                {
                    ltail->next=cur;
                    ltail=ltail->next;
                }
                cur=cur->next;
            }else
            {
               if(gtail==NULL)
               {
                ghead=gtail=cur;
               } else{
                gtail->next=cur;
                gtail=gtail->next;
               }
               cur=cur->next;
            }
         }
         if(gtail)//储存大的那个那个链表如果不是空,那么就要把最后一个节点的next置空
         {
         gtail->next=NULL;

         }
          else//如果gtail是空的话,那么就全都是小的数在lhead里,直接返回那么链表就行
         {
            return pHead;
         }
         if(lhead)
         {
            ltail->next=ghead;
             return lhead;
         }else {
         return lhead;
         }
        
         
        
        
    }
};

判断头的代码过于繁琐,那么就利用链表的标兵:
在这里插入图片描述
代码:

class Partition {
public:
    ListNode* partition(ListNode* pHead, int x) {
        // write code here
        if(pHead==NULL)
        {
            return pHead;
        }
         ListNode* ghead=NULL;
         ListNode* gtail=NULL;
         ghead=gtail=(struct ListNode*)malloc(sizeof(struct ListNode));
         ListNode* lhead=NULL;
         ListNode* ltail=NULL;
         lhead=ltail=(struct ListNode*)malloc(sizeof(struct ListNode));

         ListNode* cur=pHead;
         while(cur)
         {
            if(cur->val<x)
            {
               
                    ltail->next=cur;
                    ltail=ltail->next;
                
                
            }else
            {
               
                gtail->next=cur;
                gtail=gtail->next;
               
            }
               cur=cur->next;

         }
         
         gtail->next=NULL;

         
          ltail->next=ghead->next;
          struct ListNode* per=lhead->next;
          free(lhead);
          free(ghead);

         return per;
         
        
         
        
        
    }
};
Logo

助力广东及东莞地区开发者,代码托管、在线学习与竞赛、技术交流与分享、资源共享、职业发展,成为松山湖开发者首选的工作与学习平台

更多推荐