【链表】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 };

 

posted @ 2020-05-01 20:37  梦醒潇湘  阅读(167)  评论(0)    收藏  举报