现有一链表的头指针 ListNode* pHead,给一定值x,编写一段代码将所有小于x的结点排在其余结点之前,且不能改变原来的数据顺序,返回重新排列后的链表的头指针。链表为无头结点、单向、不循环。(由于涉及到结构体,所以写不了完整的测试代码,下面展示的代码为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; }
浙公网安备 33010602011771号