题目描述:
编写代码,以给定值x为基准将链表分割成两部分,所有小于x的结点排在大于或等于x的结点之前
给定一个链表的头指针 ListNode* pHead,请返回重新排列后的链表的头指针。注意:分割以后保持原来的数据顺序不变。
题目分析:
首先我们根据题意可以分析 这个题整体需要我们把一个链表要分为两部分,然后有将组合。
下来我们就整体分析: 我们首先可以创建两个新的链表,然后在创建这两个新链表的头节点,然后我们可以将老的链表与X判断大小,校等值放进小的链表里面,大的值放进大的链表里面,全部判断完成之后,然后我们判断小的链表的最后一位与大的链表的首位相连,然后删掉大的链表,在将小的链表与头节点相连,删除小的链表,返回pHead就行了。
下面看代码情况:
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};*/
class Partition {
public:
ListNode* partition(ListNode* pHead, int x) {
if(pHead == NULL) return NULL;
ListNode* pNode = pHead; //创建一个头节点
ListNode* small = new ListNode(0); //创建新的小链表
ListNode* big = new ListNode(0); //创建新的大链表
ListNode* psmall = small; //创建小链表的头节点
ListNode* pbig = big; //创建大链表的头节点
while(pNode)
{
if(pNode->val < x )
{
//比X小的节点,放进小的链表中
psmall->next = pNode;
pNode = pNode->next;
psmall = psmall->next;
psmall->next = NULL;
}
else
{
//比X值大的节点,放进大链表中
pbig->next = pNode;
pNode = pNode->next;
pbig = pbig->next;
pbig->next = NULL;
}
}
//将小的链表的最后一位与大的链表相连
psmall->next = big->next;
free(big);
//将小的链表的最后一位与头节点相连
pHead = small->next;
free(small);
return pHead;
}
};
看完代码之后,再看分析,我觉得这样子更加能够理解其中的含义,以及代码中,解释的那样子。
谢谢大家观看,有什么好哒方法或者理解可以下方留言。