algorithm - 对列表进行分区

标签 algorithm data-structures

ListNode* partition(ListNode* head, int x) {
    ListNode *p1 = NULL, *p2 = NULL, *cur = head, *cur1, *cur2;
    while (cur != NULL) {
        if (cur->val < x) {
            if (p1 == NULL) {
                p1 = cur;
                cur1 = cur;
            } else {
                cur1->next = cur;
                cur1 = cur1->next;
            }
        }
        else {
            if (p2 == NULL) {
                p2 = cur;
                cur2 = cur;
            } else {
                cur2->next = cur;
                cur2 = cur2->next;
            }
        }
        cur = cur->next;
    }
    if (cur2 != NULL) cur2->next = NULL;
    if (p1 != NULL && cur1 != NULL) {
        cur1->next = p2;
        return p1;
    } 
    return p2;
}

Given a linked list and a value x, partition it such that all nodes less than x come before nodes greater than or equal to x.

但是我遇到了一些测试用例的错误:

  • 运行时错误信息:

free():无效的下一个大小(快速):0x00000000020f1200 ***

  • 最后执行的输入:

    [-29,-2,-43,-26,-12,58,-55,-44,-75,83,9,46,29,-6,-79,-73,-96,66,66,-100,20,-89,-14,-67,12,96,27,-36,29,-68,29,52,30,38,79,70,-3,-76,-73,-26,60,-12,-80,-11,82,94,16,86,12,-17,39,-68,-54,-75,-82,58,74,-3,74,-45,29,-45,59,-89,94,38,82,-57,15,-91,-31,-25,-3,-58,64,-69,-64,-20,69,0,15,8,32,61,-14,2,-29,-88,-100,97,-81,29,-47,30,-7,99,-31,-73,94,36,88,-37,-89,-63,5]
    

    105

最佳答案

你的函数是正确的。该错误存在于您的代码中的其他地方。您应该搜索内存错误消息..

我简要实现了以下代码:

#include <iostream>

using namespace std;

struct ListNode{
    int val;
    ListNode* next;
};


void insert(ListNode *head, int x){
    ListNode *cur = head;
    ListNode *new_node = new ListNode;
    new_node->val = x;
    new_node->next = 0;
    while(cur->next != 0){
        cur = cur->next;
    }
    cur->next = new_node;
}

void print(ListNode *head){
    ListNode *cur = head;
    while (cur != 0){
        cout << cur->val << "-";
        cur = cur->next;
    }
    cout << "NULL" << endl;
}
ListNode* partition(ListNode* head, int x);

int main(){
    ListNode* head = new ListNode;
    head->val= 1;
    head->next = 0;
    insert(head, 4);
    insert(head, 3);
    insert(head, 2);
    insert(head, 5);
    insert(head, 2);
    print(head);
    ListNode * newhead = partition(head, 3);
    cout << endl;
    print(newhead);
    return 0;
}


ListNode* partition(ListNode* head, int x) {
    ListNode *p1 = NULL, *p2 = NULL, *cur = head, *cur1, *cur2;
    while (cur != NULL) {
        if (cur->val < x) {
            if (p1 == NULL) {
                p1 = cur;
                cur1 = cur;
            } else {
                cur1->next = cur;
                cur1 = cur1->next;
            }
        }
        else {
            if (p2 == NULL) {
                p2 = cur;
                cur2 = cur;
            } else {
                cur2->next = cur;
                cur2 = cur2->next;
            }
        }
        cur = cur->next;
    }
    if (cur2 != NULL) cur2->next = NULL;
    if (p1 != NULL && cur1 != NULL) {
        cur1->next = p2;
        return p1;
    } 
    return p2;
}

它给出 1-4-3-2-5-2 和分区列表 1-2-2-4-3-5

关于algorithm - 对列表进行分区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41977890/

相关文章:

algorithm - 给定连续的单词流,删除重复项

java - 用于管理 api 每分钟最大请求数的数据结构

algorithm - 计算老虎机支出

c++ - 实现加权图的问题[c++]

algorithm - 多边形被分成 4 部分

algorithm - 在二叉树中查找 O(1) 的中位数

java - 是否有数据结构可以执行以下操作:

c - 什么是哈希表?如何在C语言中创建哈希表?

algorithm - 该算法对于查找最长递增子序列是否正确?

database - 需要快速存储和检索(搜索)集合和子集的算法