题目要求:
链表切割
现有一链表的头指针 ListNode* pHead,给一定值x,编写一段代码将所有小于x的结点排在其余结点之前,且不能改变原来的数据顺序,返回重新排列后的链表的头指针。
思路:
这里由于需要考虑到不改变原来的数据顺序,所以先在堆区开辟两块空间,也就是两个链表
一个链表用于存储小于x的数据,另一个链表用于存储大于x的数据
最后遍历完原链表的所有节点,将存储大数据的链表尾插在存储小数据的链表上
同时需要考虑如果所有数字都大于x的情况,也就是所有节点都在存储大数据的链表上,因此采用带有哨兵位的链表更方便插入
代码实现:
//链表切割
//现有一链表的头指针 ListNode* pHead,给一定值x,编写一段代码将所有小于x的结点排在其余结点之前,且不能改变原来的数据顺序,返回重新排列后的链表的头指针。
#include<iostream>
using namespace std;
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
//这里由于需要考虑到不改变原来的数据顺序,所以先在堆区开辟两块空间,也就是两个链表
//一个链表用于存储小于x的数据,另一个链表用于存储大于x的数据
//最后遍历完原链表的所有节点,将存储大数据的链表尾插在存储小数据的链表上
//同时需要考虑如果所有数字都大于x的情况,也就是所有节点都在存储大数据的链表上,因此采用带有哨兵位的链表更方便插入
class Partition {
public:
ListNode* partition(ListNode* pHead, int x)
{
struct ListNode* smallhead;
struct ListNode* smalltail;
struct ListNode* bighead;
struct ListNode* bigtail;
smallhead = smalltail = (struct ListNode*)malloc(sizeof(struct ListNode));
bighead = bigtail = (struct ListNode*)malloc(sizeof(struct ListNode));
smalltail->next = bigtail->next = NULL;
struct ListNode* cur = pHead;
while (cur)
{
if (cur->val<x)//保存至小链表
{
smalltail->next = cur;
smalltail = smalltail->next;
}
else//保存至大链表
{
bigtail->next = cur;
bigtail = bigtail->next;
}
cur = cur->next;
}
smalltail->next = bighead->next;//小链表尾插大链表
bigtail->next = NULL;//大链表尾部指向空
pHead = smallhead->next;
free(smallhead);
free(bighead);
return pHead;
}
};