链表分化问题为给定一个阈值,使得小于等于这个阈值的结点移到前面,大于这个阈值的结点移到后面,同时保证两类结点的内部位置关系不变。
思路一:把链表元素放到数组中,利用快排思想进行排序,类似荷兰国旗问题,但因为涉及到交换,不能保证同一类结点内部位置关系不变。
思路二:将小于等于这个阈值的结点生成一个链表,大于这个阈值的结点生成一个链表,最后将两个链表连在一起即可。
注意事项:
1、每个链表保存好head和tail指针,以便首尾连接。
2、遍历到原链表中的某一结点时,先保存该结点的next值(后续结点),再将该结点从原链表断开(设置next值为0)。注意一定要将结点从原始链表中断开,否则新链表中会存储该结点的后续结点信息。
代码实现:
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};*/
class Divide {
public:
ListNode* listDivide(ListNode* head, int val) {
// write code here
if (head == NULL || head->next == NULL)
return head;
ListNode *head1 = NULL;
ListNode *tail1 = NULL;
ListNode *head2 = NULL;
ListNode *tail2 = NULL;
ListNode *next = head;
while (head != NULL) {
next = head->next;// next 存储后续结点
head->next = NULL;//必须将当前结点断开,不然该结点的后续结点信息也会保存到新链表中去
if (head->val <= val)//小于等于的链表
{
if (head1 == NULL)
{
head1 = head;
tail1 = head;
}
else {
tail1->next = head;
tail1 = head;
}
}
else {
if (head2 == NULL) {
head2 = head;
tail2 = head;
}
else {
tail2->next = head;
tail2 = head;
}
}
head = next;
}
if (head1 != NULL) {
tail1->next = head2;
return head1;
}
else
return head2;
}
};
继续阅读与本文标签相同的文章
上一篇 :
吴峰少 自媒体爆文技巧,干货分享
下一篇 :
Java_RSAwithMD5签名,C#验签
-
为什么它有典型FaaS能力,却是非典型FaaS架构? | 开发者必读(065期)
2026-05-18栏目: 教程
-
Mybatis执行SQL的4大基础组件详解
2026-05-18栏目: 教程
-
Java描述设计模式(08):桥接模式
2026-05-18栏目: 教程
-
Java描述设计模式(09):装饰模式
2026-05-18栏目: 教程
-
Java描述设计模式(10):组合模式
2026-05-18栏目: 教程
