Partition List( LeetCode )

来源:互联网 发布:淘宝如何链接 编辑:程序博客网 时间:2024/06/06 18:15

Given a linked list and a value x, partition it such that all nodes less than x come before nodes greater than or equal to x.

You should preserve the original relative order of the nodes in each of the two partitions.

For example,
Given 1->4->3->2->5->2 and x = 3,

return 1->2->2->4->3->5.

/** * Definition for singly-linked list. * struct ListNode { *     int val; *     ListNode *next; *     ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public:    ListNode *partition(ListNode *head, int x) {        if( head == NULL || head -> next == NULL )return head;<span style="white-space:pre"></span>// case 1:链表为空或者只有一个元素,则直接返回ListNode *p = NULL,*q = head;ListNode *begin = NULL,*end = NULL,*inbegin = NULL,*inend = NULL;// begin,end 为第一个大于等于x的切割位点while( q != NULL ){<span style="white-space:pre"></span>//  inbegin,inend 为切割点之后所有小于x的元素的if( q -> val >= x ){<span style="white-space:pre"></span>// 首尾元素begin = p;end = q;break;}p = q;q = q -> next;}if( q == NULL || q -> next == NULL ) return head;<span style="white-space:pre"></span>//case 2:不存在切割点或者切割点为最后一个元素,则无需改动int flag = 1;while( q != NULL ){if( q -> val < x ){p -> next = q -> next;if( flag ){<span style="white-space:pre"></span>// inbegin,inend 的赋值inbegin = q;inend = q;flag = 0;q = q -> next;continue;}inend -> next = q;inend = inend -> next;q = q -> next;}else {    p = q;    q = q -> next;}}if( inbegin == NULL )   return head;<span style="white-space:pre"></span>//case 3:切割点后不存在小于x的点,直接返回    <span style="white-space:pre"></span>else if( begin == NULL ){<span style="white-space:pre"></span>//case 4:切割点在head位置,则在head之前插入inbegin至inend的元素,inend -> next = end;<span style="white-space:pre"></span>//返回inbeginreturn inbegin;}else{<span style="white-space:pre"></span>//case 5:切割点不在首部,且之后存在小于x的元素,则将inbegin至inendbegin -> next = inbegin;<span style="white-space:pre"></span>//之间的元素插入切割点,返回headinend -> next = end;return head;}    }};


0 0
原创粉丝点击