版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
题目要求
编写代码,以给定值x为基准将链表分割成两部分,所有小于x的结点排在大于或等于x的结点之前
给定一个链表的头指针 ListNode* pHead,请返回重新排列后的链表的头指针
注意:分割以后保持原来的数据顺序不变
示例:
输入:1->9->8->3->6->5->10 x=7
输出:1->3->6->5->9->8->10
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};*/
解题思路
方法:
将小于的数放入一个链表,大于等于的放入另一个链表,再进行合并
解题演示
输入:1->9->8->3->6->5->10 x=7
输出:1->3->6->5->9->8->10
过程显示:
- 新建两个链表:small (存放小数),large (存放大数)
- 遍历链表得 small 为 1->3->6->5
- 遍历链表得 large 为 9->8->10
- 最后合并两个链表得到新链表返回,即 1->3->6->5->9->8->10
解题代码
class Partition {
public:
ListNode* partition(ListNode* pHead, int x) {
ListNode* small = new ListNode(0);
ListNode* large = new ListNode(0);
ListNode* smallHead = small;
ListNode* largeHead = large;
while (pHead)
{
if (pHead->val < x)
{
small->next = pHead;
small = small->next;
}
else
{
large->next = pHead;
large = large->next;
}
pHead = pHead->next;
}
large->next = NULL;
small->next = largeHead->next;
return smallHead->next;
}
};