zoukankan      html  css  js  c++  java
  • 力扣算法题—086分隔链表

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

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

    示例:

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

     1 #include "_000库函数.h"
     2 
     3 struct ListNode {
     4     int val;
     5     ListNode *next;
     6     ListNode(int x) : val(x), next(NULL) {}
     7 };
     8 
     9 
    10 //感觉用两条链表可能会更简单点,但内存会大点,
    11 //的确,内存多了点
    12 class Solution {
    13 public:
    14     ListNode* partition(ListNode* head, int x) {
    15         ListNode* p1 = new ListNode(-1);//用来存放小于x的数
    16         ListNode* p2 = new ListNode(-1);//用来存放其他数字
    17         ListNode* q1 = p1;
    18         ListNode* q2 = p2;
    19         while (head) {//无头结点
    20             ListNode* q = new ListNode(0);
    21             q->val = head->val;
    22             if (head->val < x) {
    23                 q1->next = q;
    24                 q1 = q;
    25             }
    26             else {
    27                 q2->next = q;
    28                 q2 = q;
    29             }
    30             head = head->next;
    31         }
    32         q1->next = p2->next;//组合为一个链表
    33         return p1->next;//不需要头结点
    34     }
    35 };
    36 
    37 //用插入法,在原链表上操作
    38 class Solution {
    39 public:
    40     ListNode* partition(ListNode* head, int x) {
    41         ListNode* p = new ListNode(-1);
    42         p->next = head;
    43         head = p;//加一个头结点
    44         ListNode* pro, *cur;
    45         pro = p;//要插入的位置
    46         cur = p;//移动的位置
    47         p = p->next;
    48         while (p) {
    49             if (p->val < x) {
    50                 ListNode* q = new ListNode(0);
    51                 q->val = p->val;
    52                 cur->next = p->next;//删除该数                
    53                 p = cur->next;
    54                 q->next = pro->next;//插入
    55                 pro->next = q;
    56                 if (cur == pro)
    57                     cur = cur->next;
    58                 pro = q;
    59             }
    60             else {
    61                 p = p->next;
    62                 cur = cur->next;
    63             }
    64         }
    65         return head->next;
    66     }
    67 };
    68 
    69 void T086() {
    70     Solution s;
    71     vector<int>v;
    72     ListNode *head = new ListNode(0);
    73     ListNode *p = head;
    74     v = { 1,4,3,2,5,2 };
    75     for (auto a : v) {
    76         ListNode *q = new ListNode(0);
    77         q->val = a;
    78         p->next = q;
    79         p = q;
    80     }
    81     p = head->next;
    82     while (p) {
    83         cout << p->val << "->";
    84         p = p->next;
    85     }
    86     cout << endl;
    87     p = s.partition(head->next,3);
    88     while (p) {
    89         cout << p->val << "->";
    90         p = p->next;
    91     }
    92     cout << endl;
    93 }
  • 相关阅读:
    C#指南,重温基础,展望远方!(3)类型和变量
    C#指南,重温基础,展望远方!(2)程序结构
    C#指南,重温基础,展望远方!(1)C#语言介绍
    ASP.NET MVC 简单的分页思想与实现
    ASP.NET MVC实现网站验证码功能
    hdu
    多种方法实现实现全排列 + sort调用标准函数库函数的简述
    HDU
    <hdu
    NYOJ-括号配对问题 <技巧性的非栈道法>
  • 原文地址:https://www.cnblogs.com/zzw1024/p/10745573.html
Copyright © 2011-2022 走看看