码迷,mamicode.com
首页 > 其他好文 > 详细

将单向链表进行分组

时间:2019-06-07 23:18:33      阅读:263      评论:0      收藏:0      [点我收藏+]

标签:int   ios   art   链表   类型   额外   else   pre   用两个   

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 }

 

将单向链表进行分组

标签:int   ios   art   链表   类型   额外   else   pre   用两个   

原文地址:https://www.cnblogs.com/zzw1024/p/10989395.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!