给定一个链表和一个特定值 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; } } };
|