链表划分
问题描述:给定一个单链表和数值x,划分链表使得所有小于x的节点排在大于等于x的节点之前。 你应该保留两部分内链表节点原有的相对顺序。 如给定链表 1->4->3->2->5->2->NULL,并且 x=3 返回 1->2->2->4->3->5->NULL。
解题思路:创建两个新链表,分别设为1,2;遍历给定链表,比较每个结点与给定值X值的大小,若比X小,则放入新链表1中,否则放入新链表2中。遍历完毕后,将新链表1 的最后一个结点指向新链表2的第一个结点,来达到将两个链表串起来从来实现划分链表的目的。
实现代码:
/**
* Definition of ListNode
* class ListNode {
* public:
* int val;
* ListNode *next;
* ListNode(int val) {
* this->val = val;
* this->next = NULL;
* }
* }
*/
class Solution {
public:
/*
* @param head: The first node of linked list
* @param x: An integer
* @return: A ListNode
*/
ListNode * partition(ListNode * head, int x) {
// write your code here
if(head==NULL)
return NULL;//判断链表是否为空
ListNode *head1=new ListNode(0);//创建一个头结点为head1的新链表
ListNode *head2=new ListNode(0);//创建一个头结点为head2的新链表
ListNode *pre1=head1;//保存头结点到pre1
ListNode *pre2=head2;//保存头结点到pre2
while(head!=NULL)
{
if(head->val<x)
{
head1->next=head;
head1=head;
}
else
{ head2->next=head;
head2=head;
}
head=head->next;
}
head2->next=NULL;
head1->next=pre2->next;//将head1尾结点与head2第一个结点相连
return pre1->next;//返回head1的第一个结点
}
};