题海拾贝:力扣 86.分隔链表
Hello大家好!很高兴我们又见面啦!给生活添点passion,开始今天的编程之路!
我的博客:<但凡.
我的专栏:《编程之路》、《数据结构与算法之美》、《题海拾贝》
欢迎点赞,关注!
1、题目
2、题解
我们先分析一下思路。他让小于x的在前,大于x的在后,并且保持相对顺序不变,那咱们就新建两个链表,然后遍历原链表,把小于x的放一个链表,大于x的节点放一个链表,最后把两个链表穿起来就好了。
需要注意的是,咱们得自己给节点初始化。给节点分配内存后别忘了把他的next置空。不然访问->next时后报错。还有一个需要注意的是,我们开辟地址应该是malloc(sizeof(struct ListNode))。我们开辟的空间应该是struct ListNode的大小,只不过是接受的时候用指针接受的,千万不要写成malloc(sizeof(struct ListNode*))!!!
另外还有一些需要注意的点我标注在代码里了:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* partition(struct ListNode* head, int x) {
struct ListNode* s1=(struct ListNode*)malloc(sizeof(struct ListNode));
struct ListNode* s2=(struct ListNode*)malloc(sizeof(struct ListNode));//开辟地址
//注意我们应该用指针接受动态开辟的地址
s1->next = NULL;
s2->next = NULL;
struct ListNode* s11 = s1;
struct ListNode* s22 = s2;
while(head)
{
if((head->val)<x)
{
s1->next = head;
s1=head;
}
else
{
s2->next=head;
s2=head;
}
head=head->next;
}
s1->next=s22->next;
s2->next=NULL;
//注意如果不加这一条,那么这个代码可能就没有尾了,导致死循环
return s11->next;
}
好了,今天的内容就分享到这,我们下期再见!