【数据结构---7】在线OJ练习题

题目描述:

编写代码,以给定值x为基准将链表分割成两部分,所有小于x的结点排在大于或等于x的结点之前
给定一个链表的头指针 ,请返回重新排列后的链表的头指针

注意:分割以后保持原来的数据顺序不变

/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) : val(x), next(NULL) {}
};*/

思路分析:

1.创建两个结果链表,分为1和2,一个用来保存小于基准值的节点,另一个用来保存大于基准值的节点
2.对原先的链表进行遍历,如果比基准值小,用尾插的方法插入第一个结果链表,反之,插入第二个
3.插入完毕之后进行两个链表的合并,将第一个链表的最后一个节点的next指向第二个链表
4.注意极端情况:
1.保存大于基准值的链表的最后一个节点不一定指向空,所以最后我们记得处理!!
2.有可能给出的基准值比其中一整条链表保存的数都大,所以这时直接返回另一条链表

代码示例:

class Partition {
public:
    ListNode* partition(ListNode* pHead, int x) 
    {
    
         ListNode* result1 = NULL; 
         ListNode* last1 = NULL;
         ListNode* last2 = NULL;
         ListNode* result2 = NULL;
         ListNode* pCur = pHead;
         
	 while (pCur != NULL)
	 {
		  if (pCur->val < x)
		  {
			   if (result1 == NULL)
			   {
				    result1 = last1 = pCur;
			   }
			   else
			   {
				    last1->next = pCur;
				    last1 = pCur;
			   }
		  }
		  else
		  {
			   if (result2 == NULL)
			   {
				    result2 = last2 = pCur;
			   }
			   else
			   {
				    last2->next = pCur;
				    last2 = pCur;
			   }
		  }
	          pCur=pCur->next;
	 }
	 if(last1!=NULL)
         {
            last1->next = result2;
         }
         if (last2 != NULL)
         {
	    last2->next = NULL;
         }
         if(last1!=NULL)
         {
            return result1;
         }
         else
         {
            return result2;
         }
    }
};

猜你喜欢

转载自blog.csdn.net/Austin_Yan/article/details/89762046