C++ 围绕给定值对链接列表进行分区并保持原始顺序
c++server side programmingprogramming
本教程中给出了一个链接列表,我们需要将所有小于 x 的数字放在列表的开头,其他数字放在列表的后面。我们还需要保持它们的顺序与之前相同。例如
输入:1->4->3->2->5->2->3, x = 3 输出:1->2->2->3->3->4->5 输入:1->4->2->10 x = 3 输出:1->2->4->10 输入:10->4->20->10->3 x = 3 输出:3->10->4->20->10
为了解决这个问题,我们现在需要制作三个链表。当我们遇到小于 x 的数字时,我们将其插入第一个列表。现在对于等于 x 的值,我们将其放入第二个列表中,对于更大的值,我们现在将其插入第三个列表中。最后,我们将列表连接起来并打印最终列表。
寻找解决方案的方法
在这种方法中,我们将维护三个列表,即小、相等、大。现在我们保持它们的顺序并将列表连接成最终列表,这就是我们的答案。
示例
上述方法的 C++ 代码
#include<bits/stdc++.h> using namespace std; struct Node{ // 我们节点的结构 int data; struct Node* next; }; // 用于创建新节点的实用函数 Node *newNode(int data){ struct Node* new_node = new Node; new_node->data = data; new_node->next = NULL; return new_node; } struct Node *partition(struct Node *head, int x){ struct Node *smallhead = NULL, *smalllast = NULL; // 我们为列表获取两个指针 //这样可以帮助我们进行连接 struct Node *largelast = NULL, *largehead = NULL; struct Node *equalhead = NULL, *equallast = NULL; while (head != NULL){ // 遍历原始列表 if (head->data == x){ // 等于 x if (equalhead == NULL) equalhead = equallast = head; else{ equallast->next = head; equallast = equallast->next; } } else if (head->data < x){//小于 x if (smallhead == NULL) smalllast = smallhead = head; else{ smalllast->next = head; smalllast = head; } } else{ // 大于 x if (largehead == NULL) largelast = largehead = head; else{ largelast->next = head; largelast = head; } } head = head->next; } if (largelast != NULL) // largelast 将指向 null,因为它是我们的最后一个列表 largelast->next = NULL; /**********Concatenating the lists**********/ if (smallhead == NULL){ if (equalhead == NULL) return largehead; equallast->next = largehead; return equalhead; } if (equalhead == NULL){ smalllast->next = largehead; return smallhead; } smalllast->next = equalhead; equallast->next = largehead; return smallhead; } void printList(struct Node *head){//用于打印列表的函数 struct Node *temp = head; while (temp != NULL){ printf("%d ", temp->data); temp = temp->next; } } int main(){ struct Node* head = newNode(10); head->next = newNode(4); head->next->next = newNode(5); head->next->next->next = newNode(30); head->next->next->next->next = newNode(2); head->next->next->next->next->next = newNode(50); int x = 3; head = partition(head, x); printList(head); return 0; }
输出
2 10 4 5 30
上述代码的解释
在上述方法中,我们将保留三个内容按顺序排列的链接列表。这三个链接列表将分别包含小于、等于和大于 x 的元素。我们的任务现在简化了。我们需要连接列表,然后返回头部。
结论
在本教程中,我们解决了围绕给定值对链接列表进行分区并保持原始顺序的问题。我们还学习了这个问题的 C++ 程序以及我们解决这个问题的完整方法(正常)。我们可以用其他语言(如 C、java、python 和其他语言)编写相同的程序。我们希望您觉得本教程有用。