Leetcode-86.分隔链表

给定一个链表和一个特定值 x,对链表进行分隔,使得所有小于 x 的节点都在大于或等于 x 的节点之前。

你应当保留两个分区中每个节点的初始相对位置。

示例:

输入: head = 1->4->3->2->5->2, x = 3
输出: 1->2->2->4->3->5

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/partition-list
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解法1:双指针

采用双指针。分析题目就是找到第一个大于x的位置,然后在这个位置前面插入它后面所有小于x的结点。所以我们可以用双指针来解决。

1.p指针用来遍历链表。

2.pfirst指针是p指针的前指针,用来进行删除某个结点操作

3.pleft,pright是要插入位置的前指针和后指针

4.pnew是新链表的头指针,pm是新链表的尾指针

5.find用来确定链表中有没有大于x的结点,如果没有直接返回原链表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
class Solution {
public:
ListNode* partition(ListNode* head, int x) {
ListNode *pnew=new ListNode(-1);
ListNode *pm=pnew;
ListNode *p=head;
ListNode *pfirst=new ListNode(-1);
pfirst->next=head;
ListNode *pleft=new ListNode(-1);
ListNode *pright=new ListNode(-1);
int find=0;
while(p!=NULL)
{
if(p->val>=x)
{
find=1;
break;
}
pfirst=p;
p=p->next;
}
if(find==0)
return head;
if(p==head)
{
pright=p;
}
else
{
pleft=pfirst;
pright=p;
}
while(p!=NULL)
{
if(p->val<x)
{
ListNode *p2=new ListNode(p->val);
pm->next=p2;
pm=pm->next;
pfirst->next=p->next;
p=p->next;
}
else
{
pfirst=p;
p=p->next;
}
}
if(pright==head)
{
pm->next=pright;
pnew=pnew->next;
return pnew;
}
else
{
pm->next=pright;
pnew=pnew->next;
pleft->next=pnew;
return head;
}
}
};