【链表】86. 分隔链表
题目:
给定一个链表和一个特定值 x,对链表进行分隔,使得所有小于 x 的节点都在大于或等于 x 的节点之前。
你应当保留两个分区中每个节点的初始相对位置。
示例:
输入: head = 1->4->3->2->5->2, x = 3
输出: 1->2->2->4->3->5
解法:
1 /** 2 * Definition for singly-linked list. 3 * struct ListNode { 4 * int val; 5 * ListNode *next; 6 * ListNode(int x) : val(x), next(NULL) {} 7 * }; 8 */ 9 class Solution { 10 public: 11 ListNode* partition(ListNode* head, int x) 12 { 13 if (NULL == head) 14 { 15 return head; 16 } 17 // 创建两个结点, 用于保存 < x的值和>=x的值 18 ListNode *before = new ListNode(0); 19 ListNode *after = new ListNode(0); 20 21 // 创建两个指针指向两个新建结点 22 ListNode *p1 = before; 23 ListNode *p2 = after; 24 25 // 遍历链表, <x的值连在before后面, >=x的值连在after后面 26 while (head) 27 { 28 if (head->val < x) 29 { 30 p1->next = head; 31 p1 = p1->next; 32 head = head->next; 33 } 34 else 35 { 36 p2->next = head; 37 p2 = p2->next; 38 head = head->next; 39 } 40 } 41 42 // 将before 和after连起来 43 p2->next = NULL; 44 p1->next = after->next; 45 46 return before->next; 47 } 48 };