您的位置:首页 > 职场人生

《程序员面试金典》--分割链表

2015-09-21 20:37 253 查看
题目描述:

编写代码,以给定值x为基准将链表分割成两部分,所有小于x的结点排在大于或等于x的结点之前,给定一个链表的头指针 ListNode* pHead,请返回重新排列后的链表的头指针。注意:分割以后保持原来的数据顺序不变。

题目分析:

要是链表换作数组要特别小心,因为搬迁数组要涉及到移动元素的开销,而移动链表的元素则容易很多,我们不需要移动和交换链表中的元素,只是改变一下每个节点的next指针就可以,我们可以创建两个链表,一个链表是存放小于x的元素,另一个链表存放大于等于x的元素,然后遍历一遍原有链表,将小于x元素的节点加到第一个链表上,将大于等于x元素的节点加到第二个链表上。便可实现分割。

程序代码如下:

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* beforeStart=NULL;
ListNode* beforeEnd=NULL;
ListNode* afterstart=NULL,*afterEnd=NULL;
ListNode* headval;
while(pHead)
{
headval=pHead->next;
if(pHead->val<x)
{
if(beforeEnd==NULL)
beforeEnd=beforeStart=pHead;
else
{
beforeEnd->next=pHead;
beforeEnd=pHead;
}
}
else
{
if(afterstart==NULL)
{
afterstart=afterEnd=pHead;
}
else
{
afterEnd->next=pHead;
afterEnd=pHead;
}
}
pHead=headval;
}
if(afterEnd)
afterEnd->next=NULL;
if(beforeEnd!=NULL)
beforeEnd->next=afterstart;
else
beforeStart=afterstart;
return beforeStart;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: