给定一个单链表和数值x,划分链表使得所有小于x的节点排在大于等于x的节点之前。
你应该保留两部分内链表节点原有的相对顺序。
样例
给定链表 1->4->3->2->5->2->null,并且 x=3
返回 1->2->2->4->3->5->null
解:很简单,主要逻辑在while循环部分。
/** * Definition of ListNode * class ListNode { * public: * int val; * ListNode *next; * ListNode(int val) { * this->val = val; * this->next = NULL; * } * } */ class Solution { public: /* * @param head: The first node of linked list * @param x: An integer * @return: A ListNode */ ListNode * partition(ListNode * head, int x) { // write your code here //用两个链表表示,分别存储小于x的节点和大于等于x的节点 ListNode* smHead=NULL,*smTail=NULL,*bgHead=NULL,*bgTail=NULL; ListNode* cur=NULL; //逻辑主体 while(head) { cur=head; head=head->next; //注意head更新的位置,不能放在循环后面更新,因为insertNode()会改变cur->next if(cur->val<x) { insertNode(smHead,smTail,cur); //将node节点插入到小于x的链表的尾部 } else { insertNode(bgHead,bgTail,cur); //将node节点插入到大于等于x的链表的尾部 } } //判断返回的链表 if(smHead==NULL) { return bgHead; } else if(bgHead==NULL) { return smHead; } else//拼接两链表 { smTail->next=bgHead; return smHead; } } //将node节点插入到链表尾部 void insertNode(ListNode* &head,ListNode* &tail,ListNode* node) { node->next=NULL; if(head==NULL) { head=node; tail=head; return; } tail->next=node; tail=tail->next; } };