给定一个单链表和数值x,划分链表使得所有小于x的节点排在大于等于x的节点之前。
你应该保留两部分内链表节点原有的相对顺序。
样例:给定链表 1->4->3->2->5->2->null,并且 x=3
返回 1->2->2->4->3->5->null
实现思路:这个题要搞懂题意,将链表划分并且不改变原来元素之间的相对顺序。我总体的思路是,建立一个新链表,先遍历一遍所给出的链表,找出比指定元素小的元素,依次链接到新链表中去。然后在遍历一次链表,找出大于等于指定数据的元素, 依次添加到新链表中。
实现代码:
* 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) {
ListNode *node,*xx;
xx=head;
if(head==NULL)
{
return head;
}
node = new ListNode;
ListNode *ddd;
ddd=node;
while(head!=NULL)
{
if((head->val) <x)
{ ListNode *first;
first=new ListNode;
first->val=head->val;
node->next=first;
node=first;
}
head=head->next;
}
while(xx!=NULL)
{
if( (xx->val)>x||(xx->val)==x)
{ ListNode *first;
first=new ListNode;
first->val=xx->val;
node->next=first;
node=first;
}
xx=xx->next;
}
return ddd->next;
// write your code here
}
};
做题感想:这个题老师讲过,我在做的时候又是对指针的移动上很糊涂,因为我两次遍历了链表,开始的时候工作指针定义的不充足,两次while循环的时候用的一个工作指针了,而在第一次循环时它的值已经变了,不是开始结点了,所以出现错误,后面才发现这个问题。