第一次尝试
现有一链表的头指针 ListNode* pHead,给一定值 x,编写一段代码将所有小于 x 的结点排在其余结点之前,且不能改变原来的数据顺序,返回重新排列后的链表的头指针。链表为无头结点、单向、不循环。(由于涉及到结构体,所以写不了完整的测试代码,下面展示的代码为 LeetCode 中写的代码)(LeetCode链接)
- 方法:双指针法,先创建两个虚头节点 max、min,用来存放分好类的数据,遍历链表,如果大于等于 x,就将结点尾插入 max 后,如果小于就尾插入 min 后最后让 min 的尾结点指向 max 头结点的下一个;因为我们这里是创建了虚头结点的,所以要将他排除在外;
struct ListNode* partition(struct ListNode* head, int x){
if(head == NULL||head->next == NULL){
return head;
}
//两个虚头结点
struct ListNode min;struct ListNode max;
min.next = NULL;max.next = NULL;
struct ListNode* pmin = &min;struct ListNode* pmax = &max;
//判断数据大小,然后分别尾插入对应的链表中
while(head){
if(head->val < x){
pmin->next = head;
pmin = pmin->next;
}
else{
pmax->next = head;
pmax = pmax->next;
}
head = head->next;
}
//链接min和max
pmax->next = NULL;
//这里要注意除去虚头结点
pmin->next = max.next;
//返回的时候也要注意,将虚头结点排除在外
return min.next;
}