描述
给定一个单链表和数值x,划分链表使得所有小于x的节点排在大于等于x的节点之前。
你应该保留两部分内链表节点原有的相对顺序。
您在真实的面试中是否遇到过这个题?
样例
给定链表 1->4->3->2->5->2->null,并且 x=3
给定一个单链表和数值x,划分链表使得所有小于x的节点排在大于等于x的节点之前。
你应该保留两部分内链表节点原有的相对顺序。
您在真实的面试中是否遇到过这个题?
样例
给定链表 1->4->3->2->5->2->null,并且 x=3
返回 1->2->2->4->3->5->null
分析
方法一:将所有小于给定值的节点取出组成一个新的链表,此时原链表中剩余的节点的值都大于或等于给定值,只要将原链表直接接在新链表后即可。
方法二:这道题要求我们划分链表,把所有小于给定值的节点都移到前面,大于该值的节点顺序不变,相当于一个局部排序的问题。那么可以想到的一种解法是首先找到第一个大于或等于给定值的节点,用题目中给的例子来说就是先找到4,然后再找小于3的值,每找到一个就将其取出置于4之前即可。
程序
/**
* Definition of singly-linked-list:
* 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 0;
ListNode * dummp = new ListNode(-1);
ListNode * newdummp = new ListNode(-1);
dummp->next = head;
ListNode * cur = dummp;
ListNode * p = newdummp;
while(cur->next != NULL){
if(cur->next->val < x){
p->next = cur->next;//存放链表增加
p = p->next;//预备下次存储
cur->next = cur->next->next;//原始链表删除小于的节点
p->next = NULL;//存放链表结尾为空
}
else{
cur = cur->next;//预备下次存储
}
}
p->next = dummp->next;
return newdummp->next;
/*
//方法二
if(head == NULL)
return 0;
ListNode * dummp = new ListNode(-1);
dummp->next = head;
ListNode * pre = dummp, * cur = head;//dummp申请的目的是有一个pre
while(pre->next && pre->next->val < x) pre = pre->next;//一直找到第一个大于x的数
cur = pre;
while(cur->next){
if(cur->next->val < x){
ListNode * tmp = cur->next;//存放小于x的节点
cur->next = tmp->next;//cur->next =cur->next->next;//跳过这个小于x的节点
tmp->next = pre->next;//将这个小于x的节点指向前面的节点的下一个节点
pre->next = tmp;//前面的节点又之前小于x的节点
pre = pre->next;//前面的节点下跳,为下次做准备
}
else{
cur = cur->next;
}
}
return dummp->next;
*/
}
};