• 将单向链表进行分组


    Problem:
      【题目】 给定一个单向链表的头节点head,节点的值类型是整型,再给定一个整数pivot。
        实现一个调整链表的函数,将链表调整为左部分都是值小于 pivot的节点,
        中间部分都是值等于pivot的节点,右部分都是值大于 pivot的节点。
        除这个要求外,对调整后的节点顺序没有更多的要求。
        例如:链表9->0->4->5->1,pivot = 3。
        调整后链表可以是1->0->4->9->5,
        可以是0->1->9->5->4。
        总之, 满足左部分都是小于3的节点,
        中间部分都是等于3的节点(本例中这个部分为空),
        右部分都是大于3的节点即可。对某部分内部的节点顺序不做要求。
      进阶:
        在原问题的要求之上再增加如下两个要求。在左、中、右三个部分的内部也做顺序要求
        要求每部分里的节点从左 到右的顺序与原链表中节点的先后次序一致。
        例如:链表9->0->4->5->1,pivot = 3。调整后的链表是0->1->9->4->5。
        在满足原问题要求的同时,左部分节点从左到右为0、1。在原链表中也 是先出现0,后出现1;
        中间部分在本例中为空,不再讨论;右部分节点 从左到右为9、4、5。在原链表中也是先出现9,然后出现4,最后出现5。

        如果链表长度为N,时间复杂度请达到O(N),额外空间复杂度请达到O(1)


    Solution:
        使用两个指针,pr后插数来存放小数,pr前插数来存放相等的数,p为遍历游动指针

    Code:

      

     1 #include <iostream>
     2 
     3 using namespace std;
     4 
     5 struct Node
     6 {
     7     int val;
     8     Node* next;
     9     Node(int a = 0) :val(a), next(NULL) {}
    10 };
    11 
    12 void Partition(Node*& head, const int num)
    13 {
    14     Node *pr, *p;
    15     p = pr = head;
    16     while (p->next)
    17     {
    18         if (p->next->val < num)
    19         {
    20             Node* q;
    21             q = pr->next;
    22             pr->next = p->next;
    23             p->next = p->next->next;
    24             pr = pr->next;
    25             pr->next = q;
    26             //p2 = p1;
    27         }
    28         else if (p->next->val == num)
    29         {
    30             Node* q;
    31             q = pr->next;
    32             pr->next = p->next;
    33             p->next = p->next->next;
    34             pr->next->next = q;
    35         }
    36         else
    37             p = p->next;
    38     }        
    39 
    40 }
    41 
    42 
    43 void Test()
    44 {
    45     int a[] = { 7,2,8,1,4,5,4,6 };
    46     Node* head = new Node(-1);
    47     Node* p = head;
    48     for (auto n : a)
    49     {
    50         Node* q = new Node(n);
    51         p->next = q;
    52         p = q;
    53     }
    54     p->next = NULL;
    55 
    56     p = head->next;
    57     cout << "原链表为: ";
    58     while (p)
    59     {
    60         cout << p->val << "->";
    61         p = p->next;
    62     }
    63 
    64     Partition(head, 4);
    65     p = head->next;
    66     cout << endl << "*******************" << endl << "分部分后的链表为: ";
    67     while (p)
    68     {
    69         cout << p->val << "->";
    70         p = p->next;
    71     }
    72     cout << endl << "=============================" << endl;
    73 }
  • 相关阅读:
    Jquery ajax异步传值的两个实用的方法,你看后肯定会用第二个
    C# ASP.NET 转换为int型的方法 很实用
    NetCore 发送邮件
    解决Visual Studio For Mac Restore失败的问题
    (转)JSONObject的toBean 和 fromObject
    javax.servlet不存在的问题
    关于范式的解说
    在远程连接mysql数据库出现问题怎么办
    (二)SpringCloud学习系列-SpringCloud
    (一)SpringCloud学习系列-微服务
  • 原文地址:https://www.cnblogs.com/zzw1024/p/10989395.html
Copyright © 2020-2023  润新知