1.题目
给定一个单链表和数值x,划分链表使得所有小于x的节点排在大于等于x的节点之前。
你应该保留两部分内链表节点原有的相对顺序。
给定链表 1->4->3->2->5->2->null,并且 x=3
返回 1->2->2->4->3->5->null
2.思路思路
新建两个链表,对两个新链表尾插。在旧链表里从头开始遍历,当遍历到小于x的值时插入到其中一个链表,当遍历到大于x的值时插入到另一个链表中,遍历到NULL时结束;最后把两个链表接起来,返回放在前面的链表头指针即可。
3.代码
/**
* 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 *leftDummy=new ListNode(0);
ListNode *rightDummy=new ListNode(0);
ListNode *left=leftDummy;
ListNode *right=rightDummy;
while(head!=NULL)
{
if(head->val<x)
{ left->next=head;
left=head;
}
else
{
right->next=head;
right=head;
}
head=head->next;
}
right->next=NULL;
left->next=rightDummy->next;
return leftDummy->next;
}
};
4.感想
对于我来说,对链表进行操作时要注意不能丢了链表的头!这是我做开始几道题时比较迷糊的地方。这个题的想法是听了课后知道的,如果要是自己想的话还是很让人大开脑洞的。现在发现很多时候都是新建链表进行后续操作的~~~! :)