描述
现有一链表的头指针 ListNode* pHead,给一定值x,编写一段代码将所有小于x的结点排在其余结点之前,且不能改变原来的数据顺序,返回重新排列后的链表的头指针。
原题传送门
好,看完题目的描述,我们来分析一下去求解这道题目
好,虽然本题的题目描述有些简略,而且连示例都没有,但这正好是锻炼我们的最佳时机,因为有些公司笔试给你的OJ题目网站也是有可能没有测试案例,这个时候你只能自己去猜测,然后慢慢画图构思,再将自己的思路转化为代码,接下去我们一起来分析一下本题如何求解
首先对于本题的题目描述我们先来理解一下,就是对于给定的一个链表一个一个定值,现在要将比这个【x】要小的数均放在其余结点之前,而且还要保持其相对顺序不变,有些同学可能没有理解题目意思,我们来画个图分析一下
简单地画了张图,题目的意思大概我下面所描述的这样👇
ListNode* lessHead, *lessTail, * greaterHead, *greaterTail;
lessHead = lessTail = (ListNode *)malloc(sizeof(ListNode));
greaterHead = greaterTail = (ListNode *)malloc(sizeof(ListNode));
lessTail->next = greaterTail->next = NULL;
ListNode* cur = pHead;
while(cur)
{if(cur->val < x){lessTail->next = cur;lessTail = lessTail->next;}else{greaterTail->next = cur;greaterTail = greaterTail->next;}cur = cur->next;
}
lessTail->next = greaterHead->next;
pHead = lessHead->next;
free(lessHead);
free(greaterHead);
return pHead;
lessTail->next = cur;
greaterTail->next = cur;
这么分析下来,相信你对这个代码改如何修改应该很清楚了吧,没错,就是将第二个链表的尾指针【greaterTial->next = NULL】,这样就可以应对特殊的测试用例了,我们来提交一下试试
过了!!!不得不说,这个声音虽然很重,但是挺多了还是很悦耳的🐶
展示一下整体的代码,可以看到,我写了一些注释,而且我的思路是很清晰的,对于做题,就是需要将复杂的问题进行一步步地拆分,将一层层的逻辑理清了,这样才能分析到问题的本质!!!
/*
struct ListNode {int val;struct ListNode *next;ListNode(int x) : val(x), next(NULL) {}
};*/
class Partition {
public:ListNode* partition(ListNode* pHead, int x) {// write code here//1.初始化定义结构体指针ListNode* lessHead, *lessTail, * greaterHead, *greaterTail;//2.为两个链表头分别申请空间lessHead = lessTail = (ListNode *)malloc(sizeof(ListNode));greaterHead = greaterTail = (ListNode *)malloc(sizeof(ListNode));//3.初始化链表尾指针指向lessTail->next = greaterTail->next = NULL;ListNode* cur = pHead; //遍历原链表的结点指针//4.内部遍历分割重组逻辑while(cur){if(cur->val < x){lessTail->next = cur;lessTail = lessTail->next; //链接到另一个链表并不会修改其next指向}else{greaterTail->next = cur;greaterTail = greaterTail->next;}cur = cur->next;}//5.链接两个链表lessTail->next = greaterHead->next;greaterTail->next = NULL; //记住特殊情况,将尾结点指针置为NULL//6.获取新链表的头pHead = lessHead->next;free(lessHead);free(greaterHead); //及时释放申请的内存,放置内存泄漏return pHead;}
};
以上就是本文所要描述的所有内容,感谢您对本文的观看,如有疑问请于评论区留言或者私信我都可以🍀
上一篇:Linux之LNMP离线安装