面试11之以给定值x为基准将链表分割成两部分

来源:互联网 发布:男友忙后没时间 知乎 编辑:程序博客网 时间:2024/05/18 07:27

编写代码,以给定值x为基准将链表分割成两部分,所有小于x的结点排在大于或等于x的结点之前

给定一个链表的头指针 ListNode* pHead,请返回重新排列后的链表的头指针。注意:分割以后保持原来的数据顺序不变。



分析:(1)创建两个链表,把大于等于x的放到链表big,小于x的放到链表small
 
            (2)将两个链表拼接起来,注意处理链表的头尾结点。


#include<iostream>using namespace std;#include<vector>struct ListNode{int val;struct ListNode *next;ListNode(int x):val(x),next(NULL) { }};ListNode* Partition(ListNode*pHead,int x){if(pHead == NULL)return NULL;ListNode *smallstart = NULL;ListNode *smallend = NULL;ListNode *bigstart = NULL;ListNode *bigend = NULL;ListNode *pCur = pHead;while(pCur){if (pCur->val < x){if (smallend == NULL) //表示这是小的部分的头结点{smallstart = smallend = pCur;}else{smallend->next = pCur;smallend = pCur;}}else{if(bigend == NULL) //表示这是大于或等于x的头结点{bigstart = bigend = pCur;}else{bigend->next = pCur;bigend = pCur;}}pCur = pCur->next;}if(smallend != NULL){smallend->next = bigstart;}if(bigend != NULL){bigend->next = NULL;}return smallstart == NULL ? bigstart: smallstart;}void test(){ListNode *p1 = new ListNode(1);ListNode *p2 = new ListNode(8);ListNode *p3 = new ListNode(3);ListNode *p4 = new ListNode(2);ListNode *p5 = new ListNode(7);p1->next = p2;p2->next = p3;p3->next = p4;p4->next = p5;ListNode *pHead =Partition(p1,3);while (pHead){cout << pHead->val << " ";pHead = pHead->next;}cout <<endl;delete p1;delete p2;delete p3;delete p4;delete p5;}int main(){test();cout << "hello..." <<endl;return 0;}



0 0
原创粉丝点击