时间限制:3秒
空间限制:32768K
热度指数:3274
算法知识视频讲解
题目描述
编写代码,以给定值x为基准将链表分割成两部分,所有小于x的结点排在大于或等于x的结点之前
给定一个链表的头指针 ListNode* pHead,请返回重新排列后的链表的头指针。注意:分割以后保持原来的数据顺序不变。
思路:题目描述的是要将小于给定x值的节点与大于x值的节点分割成两部分,而本身链表的顺序不能够改变。最后需要返回小于x值的链表+大于x值的链表的头节点。
想法很单纯,既然要分割链表就自然需要定义两个新的链表,第一步遍历整个给定的链表将每个节点的值与给定的x值作对比,当小于x的时候就把新定义的p1链表的下一个节点指向此时的temp节点,而当大于x值得时候自然就将此时的temp节点赋给p2的下一个节点。
在过程中需要保存两个新定义链表的表头,也就是要判断一下p1和p2的头结点以便最后返回头节点。下面为最终的代码示例:
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};*/
class Partition {
public:
ListNode* partition(ListNode* pHead, int x) {
// write code here
ListNode* p1 = NULL;
ListNode* p2 = NULL;
ListNode* temp = NULL;
ListNode* p1Head = NULL;
ListNode* p2Head = NULL;
while (pHead){
temp = pHead->next;
if (pHead->val<x){
if (p1 == NULL){
p1 = pHead;
p1Head = pHead;
}
else{
p1->next = pHead;
p1 = p1->next;
}
}
else{
if (p2 == NULL){
p2 = pHead;
p2Head = pHead;
}
else{
p2->next = pHead;
p2 = p2->next;
}
}
pHead = temp;
}
if (p2)
p2->next = NULL;
if (p1 == NULL)
p1Head = p2Head;
else
p1->next = p2Head;
return p1Head;
}
};
不懂的可以加我的QQ群:261035036(IT程序员面试宝典
群) 欢迎你的到来哦,看了博文给点脚印呗,谢谢啦~~