- 题目
- 解题分析
- 调试过程
- 总结
题目
给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。
你应当 保留 两个分区中每个节点的初始相对位置。
示例1:
输入:head = [1,4,3,2,5,2], x = 3 输出:[1,2,2,4,3,5]
示例 2:
输入:head = [2,1], x = 2 输出:[1,2]
提示:
- 链表中节点的数目在范围 [0, 200] 内
- -100 <= Node.val <= 100
- -200 <= x <= 200
这里的解题思路是,将链表分解成两个小链表,一个链表中的元素小于x,另一个链表中的元素大于等于x,最后将这两个链表链接起来,就得到了题目要求的结果
代码如下(C++):
class Solution {
public:
ListNode* partition(ListNode* head, int x) {
//这里用到虚拟头结点
//p1指针生成小于x的链表
ListNode* list1 = new ListNode(-1) , *p1 = list1;
//p2指针生成大于等于x的链表
ListNode* list2 = new ListNode(-1) , *p2 = list2;
//p指针用于遍历原链表
ListNode* p = head;
while(p != NULL){
if(p->val < x){
p1->next = p;
p1 = p1->next;
}
else{
p2->next = p;
p2 = p2->next;
}
//断开原链表中每个结点的next指针
ListNode *temp = p->next;
p->next = NULL;
p = temp;
}
//两个链表链接
p1->next = list2->next;
return list1->next;
}
};
调试过程
在解题过程中
ListNode *temp = p->next;
p->next = NULL;
p = temp;
这个位置的代码原本为
p = p->next;
当然,报错了(╯︵╰)
按照示例1手动画一遍代码过程发现,p1,p2在非结尾位置的结点能够将原链表的结点的next指针断开,但是这两个链表的最后一个结点在原链表中是没有断开的。
(:不偷懒了,乖乖断开)
完事了
抬走,下一个~
总结
链表的合并与分解都能够用双指针比较快速的解决,属于链表的基础题。



