题目:
给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。
你应当 保留 两个分区中每个节点的初始相对位置。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/partition-list
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
设计思路:
分别定义两个链表p和q,初始化一个链表P,让p和q指向输入的链表L。第一个while循环遍历链表p,当p的值小于输入值时,创造一个节点s,将s插入链表R中,第二个while循环,遍历链表q,当q的值大于等于输入值时,将节点插入链表R,最后输入R->next(因为头节点是NULL,所以要返回R>next否则会出现如下结果)
错误图片:
代码实现:
typedef struct Node {
int val;
struct Node* next;
}Node, * ListNode;
ListNode LinkListInit() {
Node* L;
L = (Node*)malloc(sizeof(Node)); //申请结点空间
if (L == NULL) { //判断是否有足够的内存空间
printf("申请内存空间失败\n");
}
L->next = NULL;//将next设置为NULL,初始长度为0的单链表
return L;
}
ListNode partition(ListNode L, int x) {
ListNode R,p,q;
Node* n,*r;
R = LinkListInit();
p = L;
q = L;
r = R;
while (p) {//第一个while循环返回值小于x的链表
if (p->val < x) {
n = (Node*)malloc(sizeof(Node));
n->val = p->val;
r->next = n;
r = n;
}
p = p->next;
}
//r->next = NULL;
while (q) {//第二个while循环返回值大于等于x的链表
if (q->val > x || q->val == x) {
//printf("test : %d\n", q->val);
n = (Node*)malloc(sizeof(Node));
n->val = q->val;
r->next = n;
r = n;
}
q = q->next;
}
r->next = NULL;
return R->next;
}